Bash 解释器本身有选项。
例如,第 22-23 行提到的那些Bash 的手册页:
选项
set 内置命令描述中记录的所有单字符 shell 选项都可以在调用 shell 时用作选项。此外,bash 在调用时会解释以下选项:
-c ...
-i ...
-l ...
-r ...
我在 Bash 的手册页中使用了一些搜索模式,例如:
/^\s*set
/list
是否可以打印应用于当前 shell 的这些设置的列表?
答案1
printf %s\\n "$-"
将在单个字符串中列出单个字母选项。
该参数也可以这样使用:
set -f -- ${-:+"-$-"}
echo *don\'t* *glob* *this*
set +f "$@"
首先禁用 shell文件名扩展,同时保存- 如果有 - in-f
的值。接下来,不会发生任何 glob,并且最后的文件名扩展再次启用,也可能禁用。$-
$1
+f
例如,如果首次保存-f
的值时已禁用文件名扩展$-
,则其保存的值将为(至少):
f
因此,当set
再次运行时,结果是:
set +f -f
这只会让你回到起点。
set +o
将列出所有set
表外壳选项(看杰森的回答对于shopt
有能力的人 - 这是一个词吗? - 选项)以对 shell 重新进入安全的形式。这样,您还可以执行以下操作:
state=$(set +o)
set -some -crazy -options
eval "$state"
分别保存、更改和恢复 shell 选项的状态。
要一次性处理shopt
离子和表选项:set
state=$(set +o; shopt -p)
#do what you want with options here
eval "$state"
您也可以致电set
没有用于添加 shell 当前设置的所有变量的列表的任何参数 - 也可以引用以重新进入 shell。您还可以在 bash 中另外添加该命令typeset -fp
以包含所有当前声明的 shell 函数。准备好后,您可以将它们全部放在一起eval
。您甚至可以alias
不带参数地调用更多相同的内容。不过,这……可能会掩盖它。我想有-我想,在执行之前,"$@"
您必须先将其放入数组中。bash
set
不,还有trap
。这个有点好笑。通常:
trap 'echo this is my trap' 0
(echo this is my subshell; trap)
...只会打印这是我的子shell因为子 shell 是一个新进程,并且有自己的一组trap
s - 因此不会继承任何trap
s,而是继承其父进程明确忽略的那些 -(喜欢trap '' INT
)。
然而:
trap 'echo this is my trap' 0
save_traps=$(trap)
trap
当它是第一个时表现特别仅有的命令在命令替换子 shell 中运行,因为它将以引用的格式重现父 shell 当前设置的列表,traps
以便安全地重新进入 shell。所以你可以这样做save_traps
,然后 set
没有参数 - 以及已经提到的所有其余内容 - 几乎可以锁定所有 shell 状态。不过,您可能希望显式添加export -p
和readonly -p
恢复原始 shell var 属性。
无论如何,这就足够了。
答案2
选项?:bash 中有三组选项。
由命令读取或设置的选项
set
。
(在手册中使用此命令LESS=+/'set \[--abefhkmnptuvxBCEHPT\]' man bash
:)
所有单字母选项:abefhkmnptuvxBCEHPT
还有选项(没有等效的单个字母):
set -o emacs set -o history set -o ignoreeof set -o interactive-comments set -o pipefail set -o posix set -o vi
由命令读取或设置的选项
shopt
。
(使用此命令阅读手册LESS=+/'shopt \[-pqsu\]' man bash'
:)
该列表很长但很容易打印,使用:$ shopt -p
或类似(但不等于):
$ shopt
可以在 INVOCATION 上设置的选项:(
手册命令LESS=+/'^INVOCATION' man bash
:)所有
set
选项:bash -abefhkmnptuvxBCEHPT
所有
shopt
选项bash -O option
有些选项仅在调用 bash 时才有意义:
bash -lirsDc
并且,还有(长选项):
bash --debugger --help --init-file file --rcfile file --login \ --noediting --noprofile --norc --posix --restricted \ --verbose --version
所有set
一个字母选项 和-ri
均印有$-
。
-i Interactive
Only read with `$-` (if it contains an `i`).
-r Restricted
Also read with `shopt -p restricted_shell
例如:
$ echo 'echo $0 $-' | bash -abefhikmprtuvxBCEHPT -lri
仅使用 shopt 报告调用 bash 作为登录 shell:
-l Login
read with `shopt -p login_shell`
因此:
$ echo 'shopt -p login_shell' | bash -abefhikmprtuvxBCEHPT -lri
shopt -s login_shell
该选项-n
无法通过任何代码进行测试,因为它意味着:不执行任何代码。
打印选项
列出选项的最佳工具跑步shell 中,用set
或 用 设定的值shopt
是相同的shopt
。列出设置选项:
shopt -o
其作用完全一样set -o
。使用shopt -po
可获得与 相同的结果set +o
。
列出商店选项:
shopt -p
您可以选择打印已设置shopt -ps
或未设置的内容shopt -pu
以获得所有选项。尽可能多的长选项和-sDc
INVOCATION 上的一些 ( ) 无法打印:
$ echo $-; shopt -p ; shopt -po
要将它们存储在变量中:
$ storeoptions="$(echo "set -$-"; shopt -p ; shopt -po)"
该变量可用于设置所有选项:
$ eval "$storeoptions"
答案3
答案4
要检查特定选项:
if shopt -q <OPTION>
then echo '<OPTION> is set'
fi