4.3 修改shell的行为
•内建命令set:改变shell的属性和位置参数的值。
•内建命令shopt:修改shell的可选的行为。
4.3.1 内建命令set
这个命令太复杂了,因此单独用一节来描述它。set允许你改变shell选项的值和设置位置参数,或者显示shell变量的名字和值。
set
set [--abefhkmnptuvxBCEHPT] [-o option-name] [argument …]
set [+abefhkmnptuvxBCEHPT] [+o option-name] [argument …]
如果不带选项或参数,则set显示所有shell变量的名字和值,以及所有函数,根据区域设置进行排序,显示的格式为可以重用为输入(设置或者重新设置当前的各个变量)的格式。只读变量不能被重新设置。在POSIX模式,仅仅列出shell变量。
如果带选项,则设置或者取消shell变量。选项的含义如下:
-a
标记那些被修改或者创建的变量和函数——这些变量和函数将被export到后续命令环境中。
-b
引起系统立即报告被终止的后台作业的状态,而不是在打印下一个提示符之前。
-e
如果管道(见管道)返回一个非零的状态时立即退出,该管道可以由以下内容组成:一个单一的简单的命令(见简单指令),或在括号中的一个子shell命令(见命令组合),或在大括号包围的命令列表中的某个被执行的命令(见命令分组)。下述情况下,shell不会退出:如果失败的命令是命令列表的一部分,并且后面紧随while或者until关键字,在if语句中的测试的一部分,在 && 或 | | 列表中执行的命令(除了在最终的 && 或 | | 之后的命令),在管道中的最后一个任何命令,或如果该命令的返回状态被 ! 反转。 如果设置了ERR陷阱,该陷阱在shell退出之前执行。
此选项适用于shell环境中,每个独自的子shell环境中(见命令执行环境),并可能导致子shell在执行该子shell中所有命令前退出。
-f
关闭文件名扩展(通配)
-h
查找执行命令时,定位和记住(哈希)命令。这个选项默认打开。
-k
把某条命令的所有赋值语句形式的参数放到环境中,而不是那些在命令前的参数。
-m
打开作业控制(见作业控制)
-n
读取命令,但是不执行,可以用来检查脚本的语法错误。交互shell忽略此选项。
-o option-name
设置option-name对应的选项:
allexport
同-a
braceexpand
同-B
emacs
使用emacs风格的行编辑界面(见命令行编辑)。也影响读-e的编辑界面。
errexit
同-e
errtrace
同-E
functrace
同-T
hashall
同-h
histexpand
同-H
history
启用命令历史, 见Bash历史工具。这个选项在交互shell中缺省启用。
ignoreeof
交互式shell读到EOF时,不退出。
keyword
同-k
monitor
同-m
noclobber
同-C
noexec
同-n
noglob
同-f
nolog
当前忽略。
notify
同-b
nounset
同-u
onecmd
同-t
physical
同-P
pipefail
如果设置此选项,则管道的返回值是最后(最右边)的命令的非零返回值,或者,如果所有在管道中的命令都成功退出时,是0。此选项默认关闭。
posix
修改那些与POSIX标准不同的Bash默认行为,使之符合POSIX标准(见Bash POSIX模式)。此选项使Bash的行为成为POSIX标准的严格超集。
privileged
同-p
verbose
同-v
vi
使用vi风格的行编辑界面。此选项也影响read -e的编辑界面。
xtrace
同-x
-p
打开特权模式。在这种模式下,不处理$BASH_ENV和$ENV文件,shell函数不能从环境,以及SHELLOPTS,BASHOPTS,CDPATH和GLOBIGNORE变量中继承,如果它们出现在环境中,都将被忽略。如果shell是由不等于真实用户(组)ID的有效用户(组)ID启动的,则不提供-p选项,这些动作被执行,并且有效用户ID被设置为实际用户ID。如果使用-p选项启动,有效用户ID不被复位。关闭此选项会导致有效用户ID和组ID被设置为真实用户ID和组ID。
-t
读取并执行一条命令后退出。
-u
在执行参数扩展时,把未设置变量和参数,除了特殊参数‘@’ 或者‘*’之外,视为错误。错误信息写到标准错误,并且退出非交互shell。
-v
读取shell输入时,打印shell输入行。
-x
打印简单命令、for命令、case命令、select命令,和扩展后执行前的算术for命令和该命令的参数或者相关的单词列表的跟踪信息。PS4变量的值被扩展,且在命令及其扩展参数前打印该扩展结果。
-B
shell执行大括号扩展(见大括号扩展)。此选项默认打开。
-C
防止使用‘>’,‘>&’和‘<>’ 的输出重定向覆盖已经存在的文件。
-E
如果设置此选项,shell函数,命令替换,和在子shell环境中执行的命令继承所有ERR陷阱。一般来说,ERR陷阱在上述情形下不被继承。
-H
启用‘!’风格的历史替换(见历史交互)。对于交互shell,此选项默认打开。
-P
如果设置的话,执行如cd改变当前目录等命令时,不遵循符号链接。而使用物理目录。默认情况下,执行改变当前目录的命令时,bash遵循目录的逻辑链。
例如,如果/usr/sys 是 /usr/local/sys的符号链接:
$ cd /usr/sys; echo $PWD
/usr/sys
$ cd ..; pwd
/usr
如果启用-P的话,结果是:
$ cd /usr/sys; echo $PWD
/usr/local/sys
$ cd ..; pwd
/usr/local
-T
如果设置此选项,则DEBUG和RETURN陷阱将被shell函数,命令替换,以及在子shell环境中执行的命令继承。在这种情况下,DEBUG和RETURN陷阱通常不会继承。
--
如果此选项后面没有参数,则位置参数被取消。否则,即使arguments中有以‘-’开头的项目,也被设置为位置参数。
-
选项结束的信号,把余下的arguments都赋值给位置参数。关闭-x和-v。如果没有arguments,则位置参数保持不变。
使用'+',而不是' - ',使这些选项被关闭。这些选项也可用在调用shell时。当前的选项设置可以使用$-获得 。
剩余的N个argument是位置参数,并以$1,$2,...$N的顺序被赋值。特殊参数#被设置为N。
返回状态始终是零,除非提供了无效的选项。