bash展开命令行执行顺序

  1. 把命令行分成单个命令词
  2. 展开别名
  3. 展开大括号的声明({})
  4. 展开波浪符声明(~)
  5. 命令替换$() 和 ``)
  6. 再次把命令行分成命令词
  7. 展开文件通配(*、 ?、 [abc]等等)
  8. 准备I/0重导向(<、 >)
  9. 运行命令

防止符号扩展

  • 反斜线(\)会使随后的字符按原意解释
    echo Your cost: \$5.00
    Your cost: $5.00
  • 加引号来防止扩展
    单引号(’’ )防止所有扩展
    双引号(” “)也可防止扩展,但是以下情况例外
    $(美元符号) 变量扩展
    ` ` (反引号) 命令替换
    \(反斜线) 禁止单个字符扩展
    !(叹号) 历史命令替换
  • 注意:在shell脚本中的history命令不会显示任何历史,因此无法使用。

bash的配置文件

按生效范围划分,存在两类:

  • 全局配置:
    /etc/profile
    /etc/profile.d/*.sh
    /etc/bashrc
  • 个人配置:
    ~/.bash_profile
    ~/.bashrc

目前所写已知的变量及位置:

  • /etc/profile
    umask(原生自带)
    HISTSIZE(原生自带)

  • /etc/profile.d/env.sh(自己增加易删除):
    PS1
    HISTtimeFORMAT
    HISTCONTROL
    PATH
    HISTFILESIZE

  • /.bashrc :
    alias

  • 根目录下加了隐藏文件.vimrc

交互式登录:

(1)直接通过终端输入账号密码登录
(2)使用“su - UserName” 切换的用户
执行顺序:/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile
~/.bashrc --> /etc/bashrc

  • 记忆:先profile后bashrc, 然后,Profile先全局后个人,bashrc先个人后全局
  • 注意:~/.bash_profile 中调用了~/.bashrc,会显得.bashrc先执行,其实并非如此。
  • 同样.bashrc也会调用 /etc/bashrc

非交互式登录:

(1)su UserName
(2)图形界面下打开的终端
(3)执行脚本
(4)任何其它的bash实例
执行顺序: /etc/profile.d/*.sh --> /etc/bashrc -->~/.bashrc

为了不混乱,所有变量最好只在一个文件里出现一次

按功能划分,存在两类:

profile类和bashrc类

Profile类

  • profile类:为交互式登录的shell提供配置
    全局:/etc/profile, /etc/profile.d/*.sh
    个人:~/.bash_profile
    功用:
    (1) 用于定义环境变量
    (2) 运行命令或脚本

Bashrc类

bashrc类:为非交互式和交互式登录的shell提供配置
全局:/etc/bashrc
个人:~/.bashrc
功用:
(1) 定义命令别名和函数
(2) 定义本地变量

修改profile和bashrc文件后需生效

两种方法:
1重新启动shell进程
2 . 或source
例:
. ~/.bashrc

  • 注意:这里不能用bash 加文件的方式来执行它,因为bash相当于开了一个子进程来解释它,这样的话变量都不会继承出来,所以得用source命令

Bash 退出任务

保存在~/.bash_logout文件中(用户)
在退出登录shell时运行
用于

  1. 创建自动备份
  2. 清除临时文件

set 命令

$- 变量

  • 注意$_代表上一条命令最后一个参数,别混淆
    1. h:hashall,打开这个选项后,Shell 会将命令所在的路径hash下来,避免每都要查询。通过set +h将h选项关闭,set -h打开
    2. i:interactive-comments,包含这个选项说明当前的shell是一个交互式的shell。所谓的交互式shell,在脚本中,i选项是关闭的,因为脚本是批量执行的。
    3. m:monitor,打开监控模式,就可以通过Job control来控制进程的停止、继
      续,后台或者前台执行等。
    4. B:braceexpand,大括号扩展,可将大括号内的序列展开
    5. H:history,H选项打开,可以展开历史列表中的命令,可以通过!感叹号来完成,例如“!!”返回上最近的一个历史命令,“!n” 返回第 n 个历史命令。如果关闭,虽然能看到历史,但是不能用!引用了

set 命令

-u 在扩展一个没有设置的变量时,显示错误信息,等同set –o nounset
注意这个只是显示错误信息,并不会退出,结合后面的set -e才会退出
-e 如果一个命令返回一个非0退出状态值(失败)就退出,等同set –o errexit
因为脚本错误命令虽然错误,但仍然会执行后面的命令,用这个就不会在出现错误命令的情况下继续执行脚本。
用这个的时候注意要让整体命令输出正确,不然有些情况想要继续执行脚本但有错误结果的就无法继续执行脚本了,可以用||或命令等使整体正确。

  • 更多命令查看帮助用set -o name 有更多