目录
- 基础命令
- 变量
- 创建并运行脚本
- 条件
- 循环
- 函数
- 其他(read、mktemp、trap)
其他
Bash启动环境
用户每次使用Shell,都会开启一个与Shell的Session(对话)。
Session有两种类型:登录 Session 和非登录 Session,也可以叫做 login shell 和 non-login shell。
- 登录 Session
登录 Session 是用户登录系统以后,系统为用户开启的原始 Session,通常需要用户输入用户名和密码进行登录。
登录 Session 一般进行整个系统环境的初始化,启动的初始化脚本依次如下。
/etc/profile:所有用户的全局配置脚本。/etc/profile.d目录里面所有.sh文件~/.bash_profile:用户的个人配置脚本。如果该脚本存在,则执行完就不再往下执行。~/.bash_login:如果~/.bash_profile没找到,则尝试执行这个脚本(C shell 的初始化脚本)。如果该脚本存在,则执行完就不再往下执行。~/.profile:如果~/.bash_profile和~/.bash_login都没找到,则尝试读取这个脚本(Bourne shell 和 Korn shell 的初始化脚本)。
Linux 发行版更新的时候,会更新/etc里面的文件,比如/etc/profile,因此不要直接修改这个文件。如果想修改所有用户的登陆环境,就在/etc/profile.d目录里面新建.sh脚本。
如果想修改你个人的登录环境,一般是写在~/.bash_profile里面。下面是一个典型的.bash_profile文件。
# .bash_profile
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin
PATH=$PATH:$HOME/bin
SHELL=/bin/bash
MANPATH=/usr/man:/usr/X11/man
EDITOR=/usr/bin/vi
PS1='\h:\w\$ '
PS2='> '
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
export PATH
export EDITOR
可以看到,这个脚本定义了一些最基本的环境变量,然后执行了~/.bashrc。
bash命令的--login参数,会强制执行登录 Session 会执行的脚本。
$ bash --login
bash命令的--noprofile参数,会跳过上面这些 Profile 脚本。
$ bash --noprofile
- 非登录Session
非登录 Session 是用户进入系统以后,手动新建的 Session,这时不会进行环境初始化。比如,在命令行执行bash命令,就会新建一个非登录 Session。
非登录 Session 的初始化脚本依次如下。
/etc/bash.bashrc:对全体用户有效。~/.bashrc:仅对当前用户有效。
对用户来说,~/.bashrc通常是最重要的脚本。非登录 Session 默认会执行它,而登录 Session 一般也会通过调用执行它。每次新建一个 Bash 窗口,就相当于新建一个非登录 Session,所以~/.bashrc每次都会执行。注意,执行脚本相当于新建一个非互动的 Bash 环境,但是这种情况不会调用~/.bashrc。
bash命令的--norc参数,可以禁止在非登录 Session 执行~/.bashrc脚本。
$ bash --norc
bash命令的--rcfile参数,指定另一个脚本代替.bashrc。
$ bash --rcfile testrc
- .bash_logout
~/.bash_logout脚本在每次退出 Session 时执行,通常用来做一些清理工作和记录工作,比如删除临时文件,记录用户在本次 Session 花费的时间。
如果没有退出时要执行的命令,这个文件也可以不存在。
强制脚本执行遇到错误时退出执行
默认状态下,如果脚本里面有运行失败的命令(返回值非0),Bash 默认会继续执行后面的命令。set -e可以修改默认状态,使得脚本只要发生错误,就终止执行。
#!/usr/bin/env bash
set -e
foo
echo bar
执行结果如下:
$ bash script.sh
script.sh:行4: foo: 未找到命令
set -e根据返回值来判断,一个命令是否运行失败。但是,某些命令的非零返回值可能不表示失败,或者开发者希望在命令失败的情况下,脚本继续执行下去。这时可以暂时关闭set -e,该命令执行结束后,再重新打开set -e。
set +e
command1
command2
set -e
上面代码中,set +e表示关闭-e选项,set -e表示重新打开-e选项。