4.3 修改shell的行为
1 Set 内置程序
这个内置程序非常复杂,应该有自己的章节。set
允许你改变shell选项的值并设置位置参数,或者显示shell变量的名称和值。
set
set [-abefhkmnptuvxBCEHPT] [-o option-name] [--] [-] [argument …] set [+abefhkmnptuvxBCEHPT] [+o option-name] [--] [-] [argument …]
如果没有提供选项或参数,
set
会显示所有shell变量和函数的名称和值,根据当前的locale排序,其格式可以作为设置或重置当前设置的变量的输入而重新使用。 只读变量不能被重置。 在POSIX模式下,只列出shell变量。当提供选项时,它们设置或不设置shell的属性。 如果指定了选项,则有以下含义。
-a
每一个被创建或修改的变量或函数都被赋予导出属性,并被标记为导出到后续命令的环境中。
-b
导致终止的后台作业的状态被立即报告,而不是在打印下一个主要提示之前。
-e
如果一个管道(见3 管道),可能由一个简单的命令(见2 简单的命令)、一个列表(见4 命令列表)或一个复合命令(见5 复合命令)返回非零状态,则立即退出。如果失败的命令是紧随
while
或until
关键字之后的命令列表的一部分、if
语句中测试的一部分、&&
或||
列表中执行的任何命令的一部分(除了最后的&&
或||
之后的命令)、管道中除最后一条之外的任何命令,或者命令的返回状态正在被!
颠倒,则shell不会退出。如果一个非子shell的复合命令因为在-e被忽略时命令失败而返回非零状态,那么shell不会退出。 如果设置了ERR
的陷阱,那么在shell退出前会执行。这个选项分别适用于shell环境和每个子shell环境(见3 命令的执行环境),并可能导致子shell在执行子shell中的所有命令之前退出。
如果一个复合命令或shell函数在-e被忽略的上下文中执行,在复合命令或函数体中执行的任何命令都不会受到-e设置的影响,即使-e被设置,并且有命令返回失败状态。 如果一个复合命令或shell函数在-e被忽略的上下文中执行时设置-e,该设置将不会产生任何影响,直到复合命令或包含函数调用的命令完成后。
-f
禁用文件名扩展(globbing)。
-h
定位并记住(哈希)命令,因为它们被查找执行。 这个选项默认是启用的。
-k
所有以赋值语句形式出现的参数都会被放置在命令的环境中,而不仅仅是命令名称前面的那些参数。
-m
工作控制已被启用(见7 作业控制)。 所有进程都在一个单独的进程组中运行。 当一个后台工作完成后,shell会打印出一行包含其退出状态的内容。
-n
读取命令,但不执行它们。 这可以用来检查脚本的语法错误。 这个选项在交互式shell中被忽略。
-o option-name
-
设置与option-name相对应的选项。
allexport
与
-a
相同。braceexpand
与
-B
相同。emacs
使用
emacs
式的行编辑界面(见8 命令行的编辑)。 这也会影响到用于read -e
的编辑界面。errexit
与
-e
相同。errtrace
与
-E
相同。functrace
与
-T
相同。hashall
与
-h
相同。histexpand
与
-H
相同。history
启用命令历史,如9.1 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
如果设置,管道的返回值是最后一个(最右边)以非零状态退出的命令的值,如果管道中的所有命令都成功退出,则返回值为零。 该选项在默认情况下被禁用。
posix
在默认操作与POSIX标准不同的情况下,改变Bash的行为以符合标准(参见6.11 Bash的POSIX模式)。 这旨在使Bash的行为成为该标准的严格超集。
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。-r
启用受限的shell模式。 这个选项一旦被设置,就不能取消。
-t
读取并执行一条命令后退出。
-u
在进行参数扩展时,将未设置的变量和除特殊参数‘’或‘*’以外的参数,或用‘’或‘*’下标的数组变量视为错误。 错误信息将被写入标准错误,并退出非交互式的shell。
-v
在读到shell输入行时,打印它们。
-x
在简单命令、
for
命令、case
命令、select
命令和算术for
命令及其参数或相关词表被展开后和执行前,打印它们的跟踪。PS4
变量的值被展开,其结果值被打印在命令及其展开的参数之前。-B
shell将执行大括号扩展(见大括号扩展)。 该选项默认为打开。
-C
防止使用‘>’、‘>&’和‘<>’的输出重定向,防止覆盖现有文件。
-E
如果设置了,
ERR
上的任何陷阱都会被shell函数、命令替换和在子shell环境中执行的命令所继承。 在这种情况下,ERR
上的陷阱通常不会被继承。-H
启用‘!’风格的历史替换(参见9.3 历史扩展)。 对于交互式shell,该选项默认是打开的。
-P
如果设置,在执行
cd
等改变当前目录的命令时,不要解析符号链接。而是使用物理目录。默认情况下,Bash在执行改变当前目录的命令时遵循逻辑目录链。例如,如果/usr/sys是/usr/local/sys的一个符号链接,那么。
$ cd /usr/sys; echo $PWD /usr/sys $ cd ..; pwd /usr
如果
set -P
是开着的,那么。$ cd /usr/sys; echo $PWD /usr/local/sys $ cd ..; pwd /usr/local
-T
如果设置了,
DEBUG
和RETURN
上的任何陷阱都会被shell函数、命令替换和在子shell环境中执行的命令所继承。 在这种情况下,DEBUG
和RETURN
上的陷阱通常不会被继承。--
如果这个选项后面没有参数,那么位置参数就不会被设置。否则,位置参数将被设置为arguments,即使其中一些参数以‘-’开头。
-
表示选项结束,导致所有剩余的arguments 分配给位置参数。 -x 和 -v 选项被关闭。 如果没有参数,则位置参数保持不变。
使用‘+’而不是‘-’将导致这些选项被关闭。这些选项也可以在调用shell的时候使用。当前的选项集可以在
$-
中找到。剩下的N个参数是位置参数,并依次分配给
$1
、$2
、…$N
。特殊参数#
被设置为N。除非提供了一个无效的选项,否则返回状态总是为零。
2 Shopt 内置程序
这个内置程序允许你改变额外的shell可选行为。
shopt
shopt [-pqsu] [-o] [optname …]
切换控制可选的shell行为的设置值。 这些设置可以是下面列出的那些,或者,如果使用了-o选项,也可以是
set
内置命令的-o选项所提供的那些(见1 Set 内置程序)。如果没有选项,或使用-p选项,将显示所有可设置的选项的列表,并标明每个选项是否被设置;如果提供了optnames,输出将被限制在这些选项上。 -p选项使输出以一种可重复使用的形式显示,作为输入。 其他选项有以下含义。-s
启用(设置)每个optname的功能。
-u
禁用(取消设置)每一个optname。
-q
抑制正常输出;返回状态表示optname是否被设置。 如果用-q给出多个optname参数,如果所有optname都被启用,则返回状态为0;否则为非0。
-o
将optname的值限制为
set
内置的-o选项所定义的值(见1 Set 内置程序)。
如果使用了-s或-u,而没有使用optname参数,那么
shopt
仅分别显示那些已经设置或未设置的选项。除非另有说明,
shopt
选项在默认情况下是禁用的(关闭)。如果所有的optnames都被启用,则列出选项时的返回状态为零,否则为非零。当设置或取消选项时,除非optname不是一个有效的shell选项,否则返回状态为零。
shopt
选项的列表是:assoc_expand_once
如果设置了这个选项,那么在算术表达式的计算过程中,在执行可以进行变量赋值的内置程序时,以及在执行进行数组去引用的内置程序时,shell会抑制对关联数组下标的多次评估。
autocd
如果设置了这个选项,作为目录名称的命令将被执行,就像它是
cd
命令的参数一样。 这个选项只在交互式shell中使用。cdable_vars
如果设置了这个参数,
cd
内置命令的参数如果不是目录,就会被认为是一个变量的名称,其值就是要改变的目录。cdspell
如果设置了这个选项,
cd
命令中的目录组件拼写中的小错误将被纠正。 检查的错误是移位的字符、缺失的字符和一个过多的字符。 如果发现了纠正,将打印出纠正后的路径,并继续执行命令。 这个选项只在交互式的shell中使用。checkhash
如果设置了这个选项,Bash在试图执行一个在哈希表中找到的命令之前会检查该命令是否存在。如果一个散列的命令不再存在,就会执行一个正常的路径搜索。
checkjobs
如果设置了,Bash会在退出交互式Shell之前列出任何停止和运行的作业的状态。如果有任何工作正在运行,这将导致退出被推迟,直到在没有干预命令的情况下尝试第二次退出(见7 作业控制)。 如果有工作被停止,shell总是推迟退出。
checkwinsize
如果设置了这个选项,Bash会在每个外部(非内置)命令后检查窗口大小,如果有必要,会更新
LINES
和COLUMNS
的值。 这个选项默认是启用的。cmdhist
如果设置了这个选项,Bash会尝试将多行命令的所有行保存在同一个历史记录中。这个选项在默认情况下是启用的,但只有当命令历史被启用时才会产生影响(见9.1 Bash 历史工具)。
compat31
compat32
compat40
compat41
compat42
compat43
compat44
这些控制着shell兼容模式的各个方面(见6.12 shell的兼容模式)。
complete_fullquote
如果设置了,Bash在执行补全时对文件名和目录名中的所有shell元字符进行引号。 如果没有设置,当元字符出现在要补全的单词中的shell变量引用中时,Bash会从补全的文件名中移除元字符,如美元符号,这些字符将被引号。这意味着变量名中的美元符号不会被引用,然而,任何出现在文件名中的美元符号也不会被引用。 只有当bash使用反斜线来引用完成的文件名时,这才是有效的。 这个变量是默认设置的,这是4.2以前版本中Bash的默认行为。
direxpand
如果设置了,Bash在进行文件名补全时将目录名替换为单词扩展的结果。这将改变Readline编辑缓冲区的内容。 如果不设置,Bash将尝试保留用户输入的内容。
dirspell
如果设置了这个选项,如果最初提供的目录名不存在,Bash会在单词完成过程中尝试对目录名进行拼写修正。
dotglob
如果设置了,Bash会在文件名扩展的结果中包括以‘.’开头的文件名。 文件名‘.’和‘.’必须始终被明确匹配,即使
dotglob
被设置了。execfail
如果设置了这个选项,非交互式shell在不能执行作为
exec
内置命令参数指定的文件时不会退出。如果exec
失败,一个交互式shell不会退出。expand_aliases
如果设置了这个选项,别名就会按照下面的别名,6.6 别名中的描述展开。 对于交互式shell来说,这个选项默认是启用的。
extdebug
如果在shell调用时设置,或者在shell启动文件中设置,安排在shell启动前执行调试器配置文件,与--debugger选项相同。 如果在调用后设置,则启用旨在供调试器使用的行为。
declare
内置的-F选项(见4.2 Bash的内置命令)显示与作为参数提供的每个函数名相对应的源文件名和行号。- 如果
DEBUG
陷阱运行的命令返回一个非零值,则跳过下一条命令,不执行。 - 如果
DEBUG
陷阱运行的命令返回值为2,而shell正在子程序中执行(由.
或source
内建程序执行的shell函数或shell脚本),那么shell就模拟调用return
。 BASH_ARGC
和BASH_ARGV
会按照它们的描述进行更新(见5.2 Bash 变量)。- 启用了函数追踪:命令替换、shell函数和用
( command )
调用的子壳都会继承DEBUG
和RETURN
的陷阱。 - 启用错误跟踪:命令替换、shell函数和用
( command )
调用的子shell都会继承ERR
陷阱。
extglob
如果设置了,就会启用上述的扩展模式匹配功能(见8.1 模式匹配)。
extquote
如果设置了,
$'string'
和$"string"
引号将在用双引号包围的${parameter}
扩展中进行。这个选项默认是启用的。failglob
如果设置了,在文件名扩展过程中未能匹配文件名的模式会导致扩展错误。
force_fignore
如果设置了这个选项,由
FIGNORE
shell变量指定的后缀会导致在执行单词补全时忽略单词,即使被忽略的单词是唯一可能的补全。 参见5.2 Bash 变量,以了解FIGNORE
的描述。 这个选项默认是启用的。globasciiranges
如果设置,在模式匹配括号表达式中使用的范围表达式(见8.1 模式匹配)在执行比较时的行为就像在传统C语言中一样。也就是说,当前locale的整理顺序不被考虑,所以‘b’不会在‘A’和‘B’之间整理,而大写和小写的ASCII字符会整理在一起。
globskipdots
如果设置,文件名扩展将永远不会匹配文件名‘.’和‘..’,即使模式以‘.’开头。 此选项默认为启用。
globstar
如果设置了,在文件名扩展上下文中使用的模式‘**’将匹配所有文件和零或更多的目录和子目录。 如果该模式后面有‘/’,只有目录和子目录才会匹配。
gnu_errfmt
如果设置了,shell的错误信息就会以标准的GNU错误信息格式来写。
histappend
如果设置了,当shell退出时,历史列表会被附加到以
HISTFILE
变量的值命名的文件中,而不是覆盖文件。histreedit
如果设置了这个选项,并且使用了 "读行",用户就有机会重新编辑一个失败的历史替换。
histverify
如果设置了,并且正在使用Readline,历史替换的结果不会立即传递给shell解析器。相反,结果行被加载到Readline编辑缓冲区,允许进一步修改。
hostcomplete
如果设置了这个选项,并且正在使用Readline,那么当含有‘@’的单词正在完成时,Bash将尝试执行主机名完成(参见Letting Readline Type For You)。这个选项在默认情况下是启用的。
huponexit
如果设置了,当交互式登录的shell退出时,Bash将向所有的作业发送
SIGHUP
(见6 信号)。inherit_errexit
如果设置了,命令替换会继承
errexit
选项的值,而不是在子shell环境中取消设置。 当POSIX模式被启用时,这个选项会被启用。interactive_comments
允许以‘#’开头的单词导致该单词和该行的所有剩余字符在交互式shell中被忽略。 该选项在默认情况下被启用。
lastpipe
如果设置了,并且作业控制没有激活,那么shell将运行当前shell环境中未在后台执行的管道的最后一条命令。
lithist
如果启用,并启用
cmdhist
选项,多行命令将被保存到历史记录中,并嵌入换行符,而不是尽可能地使用分号分隔符。localvar_inherit
如果设置了,局部变量就会在分配任何新值之前,继承存在于前一个作用域的同名变量的值和属性。
nameref
属性不被继承。localvar_unset
如果设置了,在以前的函数作用域中对局部变量调用
unset
,就会对它们进行标记,这样后续的查找会发现它们没有被设置,直到该函数返回。这与在当前函数作用域中取消设置局部变量的行为是相同的。login_shell
如果shell作为一个登录shell启动,它就会设置这个选项(见6.1 调用Bash)。 这个值不能被改变。
mailwarn
如果设置了,并且Bash正在检查的文件在上次检查后被访问过,则会显示
"The mail in mailfile has been read"
的信息。no_empty_cmd_completion
如果设置了这个选项,并且使用了Readline,那么当试图在空行上完成时,Bash将不会试图搜索
PATH
以获得可能的完成。nocaseglob
如果设置,Bash在进行文件名扩展时将以不区分大小写的方式匹配文件名。
nocasematch
如果设置了,Bash在执行
case
或[[
条件命令(见5.2 条件性结构)时,在执行模式替换词扩展时,或作为可编程完成的一部分过滤可能的完成时,以不区分大小写的方式进行模式匹配。noexpand_translation
如果设置,Bash将$"..."的翻译结果括在单引号中,而不是双引号中。 如果字符串没有被翻译,这就没有影响。
nullglob
如果设置,Bash允许没有匹配文件的文件名模式扩展到一个空字符串,而不是自己。
patsub_replacement
如果设置了这个选项,Bash会将模式替换的替换字符串中出现的‘&’扩展为模式匹配的文本,如上所述(见3 Shell参数扩展)。 这个选项默认是启用的。
progcomp
如果设置,则启用可编程完成设施(见8.6 可编程完成)。 该选项在默认情况下是启用的。
progcomp_alias
如果设置了,并且启用了可编程完成,Bash会将一个没有任何完成的命令名视为可能的别名,并尝试进行别名扩展。如果它有一个别名,Bash会使用扩展后的别名所产生的命令字来尝试可编程完成。
promptvars
如果设置了这个选项,提示字符串在被扩展后会进行参数扩展、命令替换、算术扩展和引号删除,具体描述如下(见6.9 控制提示符)。 这个选项在默认情况下是启用的。
restricted_shell
如果shell在受限模式下启动,就会设置这个选项(见6.10 受限制的shell)。 这个值不能改变。 在执行启动文件时,这个选项不会被重置,允许启动文件发现一个shell是否受限。
shift_verbose
如果设置了这个选项,当移位次数超过位置参数的数量时,
shift
内置程序会打印出一条错误信息。sourcepath
如果设置了,
.
(source
)内置程序会使用PATH
的值来查找包含作为参数提供的文件的目录。 这个选项默认是启用的。varredir_close
如果设置,shell会自动关闭使用
{varname}
重定向语法(见重定向)分配的文件描述符,而不是在命令完成时让它们处于开放状态。xpg_echo
如果设置了,
echo
内置程序默认会扩展反斜杠转义序列。