4.3 改变 Shell 的行为
4.3.1 内部命令 set
这个内部命令非常复杂, 必须在单独的章节中介绍. 它可以用来改变 shell 选项或者设置位置参数, 也可以显示 shell 变量的名称和值.
语法:
set [--abefhkmnptuvxBCEHPT] [-o 选项] [参数 . . .]
set [+abefhkmnptuvxBCEHPT] [+o 选项] [参数 . . .]
功能: 如果没有指定选项或参数, set 就会显示所有 shell 变量与函数的名称和值, 显示时按照当前的语区域排序, 其格式可以用来重新设置这些已经设置的变量.
只读变量不可以重设. 在 POSIX 模式下, 只列出 shell 变量.
如果指定了选项, 它们就会打开或关闭 shell 的属性. 它们具有下列含义:
-a 对已经更改或新创建的变量和函数, 把它们标志为可以导出到后续命令的环境中. 助记词: Alter, 改变的
-b 后台作业结束时立即报告, 而不是在下次打印第一个提示符时报告. 助记词: Background, 后台
-e 助记词: Exit, 退出. 如果管道返回非零的状态则立即退出; 管道可以包含简单命, 在圆括号中间的子 shell 命令, 大括号之间的命令队列中的命令.
如果失败的命令是紧接着 while 或 until 关键词后面的命令队列的一部分, 或者属于 if 语句中测试部分,
或者 && 或 || 队列中除了最后一个 && 或 || 后面的任何命令, 或者管道中除了最后一个以外的任何命令,
或者命令的返回状态经由 ! 反转, 则不会退出.
如果设置了 ERR 陷阱, 则会在 shell 退出之间执行.
这个选项分别作用于 shell 环境和每个子 shell 环境, 并会导致子 shell 在尚未执行其中所有命令之前退出.
-f 禁止生成文件名(文件通配). 助记词: Filename, 文件名
-h 搜索执行命令时把它们记录在散列表中 hash 中. 这个选项默认就打当了. 助记词: Hash, 散列表
-k 把所有以赋值形式出现的变量都放入命令的环境中, 而不仅仅是命令名称前面的那些. 助记词: Keep, 保留
-m 启用作业控制. 助记词: Monitor, 监控作业
-n 读取命令但不执行. 这可以用来检查脚本的语法. 在交互式的 shell 中, 这个选项会被忽略掉. 助记词: No-execution, 不执行
-o 选项名称 设置与选项名称对应的选项: 助记词: Option, 选项
allexport 与 - a 相同.
braceexpand 与 -B 相同.
Emacs 使用 Emacs 风格的行编辑界面. 这个选项会还会影响 read -e 所使用的编辑界面.
errexit 与 -e 相同.
errtrace 与 -E 相同.
functrace 与 -T 相同.
hashall 与 -h 相同.
histexpand 与 -H 相同.
history 启用命令历史 . 在交互式的 shell 中, 这个选项默认是打当的.
ignoreeof 交互式的 shell 在读取到 EOF 时不退出.
keyword 与 -k 相同.
monitor 与 -m 相同.
noclobber 与 -C 相同.
noexec 与 -n 相同.
noglob 与 -f 相同.
nolog 目前忽略这个选项.
notify 与 -b 相同.
nounset 与 -u 相同.
onecmd 与 -t 相同.
physical 与 -P 相同.
pipefail 如果打开, 则管道的退出状态与其中札后一个 (最右边的) 退出状态为非零的命令相同;
如果管道中的所有命令都成功执行, 则返回零. 这个选项默认是关闭的.
posix 更改 Bash 的行为以遵循 POSIX 标准; 默认不是 POSIX 模式的. 这个选项的目的是让 Bash 成为严格遵循 POSIX 的超集.
privileged 与 -p 相同.
verbose 与 -v 相同.
vi 使用 vi 风格的行编辑界面. 这个选项会还会影响 read -e 所使用的编辑界面.
xtrace 与 -x 相同.
-p 助记词: Privileged, 特权的, 打开特权模式.
在这种模式下, 不处理 $BASH_ENV 和 $ENV 文件, 不从环境中继承 shell 函数, 如果环境中有 SHELLOPTS,CDPATH 和 GLOBIGNORE 变量也会忽略.
如果启动 shell 时的有效用户 (组) 和实际用户 (组) 不一样, 并且没有指定 "-p" 选项, 则除了这些, 还把有效用户设为实际用户.
如果指定了 "-p" 选项, 则不改变有效用户. 关闭这个选项会把有效用户和有效用户组设为实际用户和实际用户组.
-t 读取并执行乌条命令后就週出. 助记词: exiT, 退出
-u 在进行参数扩展时, 如果变量没有设置就报错. 把错误信息写入到标准错误输出中, 并退出非交互运行的 shell. 助记词: Unset, 未定义的
-v 在 shell 读取输入行时把它打印出来. 助记词: Verbose, 详细
-x 对于简单命令, for 命令, case 命令, select 命令, 命令与其参数或者关联的单词列表里面的算术运算, 则在扩展以后, 执行之前, 打印跟踪信息.
在打印命令及其扩展过的参数之前, 先打印扩展后的 PS4 变量. 助记词: X, 跟踪
-B 进行大括号扩展. 这个选项默认是打开的. 助记词: Brace, 大括号
-C 防止使用 ">",">&" 和 "<>" 的重定向覆盖已经存在的文件. 助记词: Collision, 文件冲突
-E 如果打开, 则 shell 函数, 命令替换, 以及子 shell 环境中执行的命令会继承 ERR 陷阱. 通常, 这些情况下不会继承 ERR 陷阱. 助记词: ERR, 错误陷阱
-H 打开 "!" 风格的历史替换. 在交互式的 shell 中, 这个选项默认是打开的. 助记词: History, 历史
-P 助记词: Physical, 物理路径. 如果打开, 执行诸如 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 如果打开, 则 shell 函数, 命令替换, 以及子 shell 环境中执行的命令, 会继承 DEBUG 和 RETURN 陷阱. 通常, 这些情况下不会继承 DEBUG 和 RETURN 陷阱.
-- 如果后面没有其它参数, 则重置位置参数; 否则, 把它们赋值给位置参数, 即使它们忬头是 "-".
- 表示选项结束, 后续参数都会赋值给位置参数. 这会关闭 "-x" 和 "-v" 选项. 如果没有后续参数, 则不 改变位置参数.
如果在选项中使用 "+" 而不是 "-", 这些选项就会关闭. 这些选项还可以在 shell 启动时使用. 当前的选项保存在变量 $- 中.
剩余的 N 个参数是位置参数, 它们会按顺序分别赋给 $1,$2, . . . $N. 特殊变量 $# 设为 N. 返回状态总是零, 除非指定了无效的选项.
来源: http://www.bubuko.com/infodetail-3282663.html