附录 G...
Shell 选项与 Shell 变量 (Shell Options & Shell Variables)
每种 Shell 都提供了许多方式,让你可以
控制它的行为。Bourne Shell 家族(Bash、
Korn Shell)使用 Shell 选项;而
关于 Shell 选项和 Shell 变量的详细 讨论,请参见第 12 章。
Bourne Shell 家族
(Bourne Shell Family)
Bourne Shell 家族使用大量选项来 控制 Shell 的行为。尤其是,交互式 Shell 所需的选项与非交互式 Shell 不同。(事实上,这正是它们成为 交互式 Shell 的原因。)
指定这类选项有两种方式。第一, 按标准方式调用:在启动 Shell 时于 命令行上指定选项。自动运行的 非交互式 Shell 属于这种情况,你自己 通过输入命令启动的交互式 Shell 也是 这种情况。例如:
bash -vx
(顺带一提,当你要测试或调试 Shell 脚本时,这两个选项格外有用。)
在交互式 Shell 内部 — 也就是在 Shell 提示符下 — 你可以随时打开 或关闭选项。要设置(打开)某个选项, 使用 set ‑o 命令。要取消 (关闭)某个选项,使用 set +o 命令。使用这些命令时,你要给出 选项的长名称,而不是它的缩写。 例如:
set -o verbose
set +o xtrace
要显示所有选项的当前状态,单独 使用其中任意一个命令即可:
set -o
set +o
-o 这种形式会打印便于人阅读的 输出;+o 则打印适合脚本使用的 输出。(不妨试一试。)
总而言之,Bourne Shell 家族使用的 Shell 选项非常多。大多数情况下, 你并不需要改动它们,因为默认值就 已经很好用。不过作为参考,图 G-1 中的表格汇总了 Bash 和 Korn Shell 的 Shell 选项。并非所有选项在所有 Shell 中都可用,所以一定要看最左边 那一列,它显示了每个选项分别被 哪些 Shell 支持。
— 提示 —
在 Bash 中,还有一些额外的选项可以 用来控制各种特性。要设置和取消这些 选项,你使用 shopt("shell options") 命令。这些 shopt 选项极为冷僻, 你多半用不到。不过,如果你有空想 看一看,请参阅 shopt 的 man 手册页。
如果你有空想看一下这些选项, 了解 shopt 选项最好的地方是 Bash 的 man 手册页。要找到相关讨论, 可以搜索 "shopt"。
图 G-1: Bourne Shell 家族:Shell 选项(Figure G-1: Bourne Shell family: Shell options)
这张表汇总了 Bourne 家族 Shell 中 重要的 Shell 选项。最左边一列显示 各个选项被哪些 Shell 支持:B = Bash; K = Korn Shell。圆点表示某个 Shell 不支持该选项。请注意,有些选项 (例如 bgnice)只有长名称,而没有 短选项名。要了解更多信息,请参阅 你所用 Shell 的 man 手册页。
说明:(1) Bash 虽然支持 emacs 和 vi 选项,但并不使用 -E 和 -V。(2) Korn Shell 使用 -h 和 -t,但不支持长名称 hashall 和 onecmd。
| Shell | 选项 | 长名称 | 含义 |
|---|---|---|---|
| B K | -a | allexport | 导出此后定义的所有变量和函数 |
| • K | bgnice | 以较低的优先级运行后台作业 | |
| B • | -B | braceexpand | 大括号扩展:启用 |
| B K | -c | — | 从字符串参数读取命令 |
| B K | -E | emacs | 命令行编辑器:Emacs 模式;关闭 vi 模式 |
| B K | -e | errexit | 若命令执行失败,则中止并退出脚本 |
| B K | -h | hashall | 找到命令时就散列(记住)命令的位置 |
| B • | -H | histexpand | 命令历史:启用 ! 风格的历史替换 |
| B • | history | 命令历史:启用 | |
| B K | -I | ignoreeof | 忽略 eof 信号 ^D;用 exit 退出 Shell(见第 7 章) |
| B K | -k | keyword | 将所有关键词参数放入环境中 |
| • K | markdirs | 通配文件名时,在目录名后追加 / | |
| B K | -m | monitor | 作业控制:启用 |
| B K | -C | noclobber | 不允许重定向的输出替换文件 |
| B K | -n | noexec | 调试:读取命令、检查语法,但不执行 |
| B K | -f | noglob | 通配文件名(文件名扩展):禁用 |
| • K | nolog | 不把函数定义保存到历史文件中 | |
| B K | -b | notify | 作业控制:后台作业一结束就立即通知 |
| B K | -u | nounset | 把使用未设置的变量当作错误 |
| B K | -t | onecmd | 读取并执行一条命令,然后退出 |
| B • | posix | 遵循 POSIX 标准 | |
| B • | -p | privileged | 以特权模式运行脚本或启动 Shell |
| B • | -r | — | 以受限模式启动 Shell |
| • K | -s | — | 对位置参数排序 |
| • K | trackall | 别名:把命令替换为完整的路径名 | |
| B K | -v | verbose | 调试:把每条命令回显到 stderr(标准错误) |
| B K | -V | vi | 命令行编辑器:vi 模式;关闭 Emacs 模式 |
| • K | viraw | 在 vi 模式中:每键入一个字符就处理该字符 | |
| B K | -x | xtrace | 调试:命令执行时回显到 stderr(也就是跟踪) |
| Shell | 选项 | 长名称 | 含义 |
C-Shell 家族
(C-Shell Family)
C-Shell 家族同样使用选项来 控制 Shell 的行为。这些选项汇总在 图 G-2 中。如果你把图 G-2 中的选项 与图 G-1 中的选项比较一下,就会发现 大多数 C-Shell 选项也被 Bourne Shell 家族使用。不过,两者之间有一个 重要区别。
在 Bourne Shell 家族中,Shell 的行为 完全由选项控制,而选项有三种类型: 常规的命令行选项(例如 -v)、 与 set +o 命令一起使用的 "长名称"选项,以及只能与 Bash 的 shopt 命令一起使用的大量额外选项。
尽管 C-Shell 家族确实使用了少量 命令行选项(图 G-2),但在很大程度上, Shell 的行为是由 Shell 变量控制的。 这正是 C-Shell 家族与 Bourne Shell 家族之间的重要区别之一, 第 12 章对此有详细解释。作为参考, 图 G-3 汇总了 C-Shell 和 Tcsh 使用的 Shell 变量。
图 G-2: C-Shell 家族:Shell 选项(Figure G-2: C-Shell family: Shell options)
这张表汇总了 C-Shell 家族中 重要的 Shell 选项。最左边一列显示 各个选项被哪些 Shell 支持:C = C-Shell; T = Tcsh。圆点表示某个 Shell 不支持 该选项。要了解更多信息,请参阅 你所用 Shell 的 man 手册页。
说明:-v 和 -V 选项是通过设置 verbose 这个 Shell 变量来起作用的。 -x 和 -X 选项是通过设置 echo 这个 Shell 变量来起作用的。
| Shell | 选项 | Shell 变量 | 含义 |
|---|---|---|---|
| C T | -c | — | 从字符串参数读取命令;与 -s 比较 |
| • T | -d | — | 从 .cshdirs 文件载入目录栈 |
| C T | -e | — | 若命令执行失败,则中止并退出脚本 |
| C T | -i | — | 交互模式(影响提示符、错误处理等) |
| C T | -n | — | 调试:读取命令、检查语法,但不执行 |
| C T | -s | — | 从 stdin(标准输入)读取命令;与 -c 比较 |
| C T | -t | — | 读取并执行一条命令,然后退出 |
| C T | -v | verbose | 调试:回显每条命令,仅在历史替换之后 |
| C T | -V | verbose | 调试:在读取 .tcshc/.cshrc 文件之前设置 verbose |
| C T | -x | echo | 调试:回显每条命令,在所有替换之后 |
| C T | -X | echo | 调试:在读取 .tcshc/.cshrc 文件之前设置 echo |
图 G-3: C-Shell 家族:Shell 变量(Figure G-3: C-Shell family: Shell variables)
这张表汇总了 C-Shell 家族中用来 控制 Shell 行为的重要 Shell 变量。 最左边一列显示各个选项被哪些 Shell 支持:C = C-Shell; T = Tcsh。圆点表示某个 Shell 不支持该选项。
要了解更多信息,请参阅你的 Shell 的 man 手册页。要了解有关 自动补全、拼写纠正或命令行编辑的 信息,请参阅 Tcsh 的 man 手册页。 关于 Shell 变量的详细讨论,请参见 第 12 章。
| Shell | Shell 变量 | 含义 |
|---|---|---|
| • T | addsuffix | 自动补全:在目录名后追加 /(斜杠) |
| • T | ampm | 以 12 小时制的 AM/PM 格式显示时间 |
| • T | autocorrect | 拼写纠正:在尝试补全之前先调用拼写单词编辑器 |
| • T | autoexpand | 自动补全:在尝试补全之前先调用 expand-history 编辑器 |
| • T | autolist | 自动补全:补全失败时,列出其余候选项 |
| • T | autologout | 如果你没有键入命令,自动登出前的时间(以分钟计) |
| C T | cdpath | cd、chdir、popd 要搜索的目录 |
| • T | color | 让 ls-F 命令使用颜色 |
| • T | complete | 自动补全:igncase=忽略大小写;enhance=把 . - _ 也当作分隔符 |
| • T | correct | 拼写纠正:cmd=命令;all=整行;complete=改为执行补全 |
| C T | cwd | 你当前的工作目录(与 owd 比较) |
| C T | echo | 调试:回显每条命令,在所有替换之后 |
| • T | echo_style | echo 命令:bsd(支持 -n);sysv(支持 \ 转义);both;none |
| • T | edit | 命令行编辑器:启用 |
| C T | fignore | 自动补全:要忽略的后缀 |
| C • | filec | 自动补全:启用(在 Tcsh 中始终开启) |
| • T | group | 当前的 groupid(组 ID) |
| C T | hardpaths | 目录栈:解析路径名,使其不含符号链接 |
| C T | history | 命令历史:历史列表中的行数 |
| C T | home | 你的主目录 |
| C T | ignoreeof | 收到 eof 信号(^D)时不退出 Shell |
| • T | implicitcd | 单独键入一个目录名,就意味着切换到该目录 |
| • T | inputmode | 命令行编辑器:在行首设置初始模式,insert 或 overwrite |
| • T | listjobs | 作业控制:每当有作业被挂起时列出所有作业;long = 长格式 |
| • T | loginsh | 设置此变量用以表明这是一个登录 Shell |
| C T | 要检查是否有新邮件的文件列表 | |
| • T | matchbeep | 自动补全:发出提示音;ambiguous、notunique、never、nomatch |
| C T | nobeep | 自动补全:从不发出声音 |
| C T | noclobber | 不允许重定向的输出替换文件 |
| C T | noglob | 通配文件名(文件名扩展):禁用 |
| C T | notify | 作业控制:后台作业一结束就立即通知 |
| • T | owd | 你最近一次[原先]的工作目录(与 cwd 比较) |
| C T | path | 搜索程序时要查找的目录 |
| C T | prompt | 你的 Shell 提示符(修改这个变量即可自定义) |
| • T | pushdsilent | 目录栈:pushd 和 popd 不列出目录栈 |
| • T | pushdtohome | 目录栈:不带参数的 pushd 默认使用主目录(如同 cd) |
| • T | recexact | 自动补全:即使可能存在更长的匹配,也优先匹配完全相同的那一项 |
| • T | rmstar | 执行 rm *(删除所有文件)之前强制用户确认 |
| • T | rprompt | 显示提示符时,打印在屏幕右侧的字符串(提示:设为 %/) |
| • T | savedirs | 目录栈:登出之前保存目录栈 |
| C T | savehist | 命令历史:登出之前把指定数目的行保存到历史列表中 |
| C T | shell | 你的登录 Shell 的路径名 |
| C T | term | 你所使用的终端类型 |
| C T | user | 当前的 userid(用户 ID) |
| C T | verbose | 调试:回显每条命令,仅在历史替换之后 |
| • T | visiblebell | 使用屏幕闪动代替可听见的声音 |
| Shell | Shell 变量 | 含义 |
© 本书全部内容,2026 年版权所有,Harley Hahn
完整的商标与版权信息