我有一个包含以下行的shell脚本:
[ "$DEBUG" == 'true' ] && set -x
set -x
启用shell的一种模式,其中所有执行的命令都会打印到终端。在您的情况下,它明显是用于调试,这是 set -x
的典型用例:如果脚本的功能不如预期,打印执行的每个命令可以帮助您可视化脚本的控制流程。
set +x
禁用该模式。
set -e
,将使脚本在发生错误时退出并显示错误信息(除非特别处理)。与默认情况相比,我认为这种方式更可取,因为默认情况下脚本会继续运行而不管错误(就像Visual Basic中臭名昭著的On Error Resume Next
一样)。 - John Zwinckset -e
的副作用非常不好,甚至会使代码审查几乎变得不可能(因为一行代码的行为取决于调用栈上下文 -- 如果在“检查”上下文中调用函数,则对该调用以及其所有子调用禁用 set -e
)。请参见BashFAQ#105中的练习。 - Charles Duffyrking
是谁。Greycat是BashFAQ的作者,freenode IRC #bash频道的长老等等——如果你要通过权威来争论,了解领域内的权威人物会有所帮助。而且,我绝对会为 tediously 检查每个命令的退出处理辩护,就像在 C 或 Go 中进行代码审查一样,或者任何其他不支持异常的语言。依赖于 set -e
就是依赖于一些根本不可靠的东西。 - Charles Duffy打印简单命令的跟踪,对于命令、case命令、select命令以及算术命令和它们的参数或关联的词列表,在它们被展开但尚未执行之前。PS4变量的值被展开,并在命令及其展开后的参数之前打印出结果值。
[source]
set -x
echo $(expr 10 + 20)
+ expr 10 + 20
+ echo 30
30
set +x
echo $(expr 10 + 20)
30
set -x
的用法。当它被使用时,上述算术表达式会被展开。我们可以看到一行代码是如何逐步评估的。
expr
。echo
。要了解更多关于set的信息,请访问此链接。
说到你的shell脚本,
[ "$DEBUG" == 'true' ] && set -x
DEBUG
时可能会打印一些额外的信息行。传统上,当脚本使用可选参数如-d
调用时,人们习惯启用调试模式。$( )
而不是反引号。自从上世纪90年代初首次发布以来,它已成为POSIX.2标准的一部分,因此没有任何有意义的可移植性损失,并且它的形式更好(嵌套良好,不改变包含在内部的反斜杠的含义等)。 - Charles Duffy-u:默认情况下禁用。启用后,当使用未配置的变量时会显示错误消息。
-v:默认情况下未激活。激活后,在输出信息之前将显示信息的原始内容(未经过变量解析)。
-x:默认情况下未激活。如果激活,命令内容将在运行命令之前显示(经过变量解析后,添加了++符号)。
比较以下差异:
/ # set -v && echo $HOME
/root
/ # set +v && echo $HOME
set +v && echo $HOME
/root
/ # set -x && echo $HOME
+ echo /root
/root
/ # set +x && echo $HOME
+ set +x
/root
/ # set -u && echo $NOSET
/bin/sh: NOSET: parameter not set
/ # set +u && echo $NOSET
help -m set | less
。 - Cyrus-m set
的帮助。这很有效。在询问之前,我尝试了man set
,但在Ubuntu上会显示No manual entry for set
。 - Oleset
是内置于bash中的命令,因此如果您查看man bash
,可以在“SHELL BUILTIN COMMANDS”部分找到它。在查看man页面时,您可以通过搜索这个正则表达式\bset \[
来快速跳转到该部分。 - User5910man
用于非内置命令,help
用于shell内置命令。 - codeforester=
而不是==
;后者是一个非标准扩展,前者是官方标准化的,并且保证在所有符合POSIX标准的sh
实现中都可用。 - Charles Duffy