4.3 修改shell的行为

评论 0 浏览 0 2023-01-26

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 复合命令)返回非零状态,则立即退出。如果失败的命令是紧随whileuntil关键字之后的命令列表的一部分、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函数不从环境中继承,SHELLOPTSBASHOPTSCDPATHGLOBIGNORE变量,如果它们出现在环境中,将被忽略。如果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

如果设置了,DEBUGRETURN上的任何陷阱都会被shell函数、命令替换和在子shell环境中执行的命令所继承。 在这种情况下,DEBUGRETURN上的陷阱通常不会被继承。

--

如果这个选项后面没有参数,那么位置参数就不会被设置。否则,位置参数将被设置为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会在每个外部(非内置)命令后检查窗口大小,如果有必要,会更新LINESCOLUMNS的值。 这个选项默认是启用的。

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选项相同。 如果在调用后设置,则启用旨在供调试器使用的行为。

  1. declare内置的-F选项(见4.2 Bash的内置命令)显示与作为参数提供的每个函数名相对应的源文件名和行号。
  2. 如果DEBUG陷阱运行的命令返回一个非零值,则跳过下一条命令,不执行。
  3. 如果DEBUG陷阱运行的命令返回值为2,而shell正在子程序中执行(由.source内建程序执行的shell函数或shell脚本),那么shell就模拟调用return
  4. BASH_ARGCBASH_ARGV会按照它们的描述进行更新(见5.2 Bash 变量)。
  5. 启用了函数追踪:命令替换、shell函数和用( command )调用的子壳都会继承DEBUGRETURN的陷阱。
  6. 启用错误跟踪:命令替换、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内置程序默认会扩展反斜杠转义序列。

最后更新2023-03-17
0 个评论