set -x`有什么作用?


259

我有一个shell脚本,其中包含以下行:

[ "$DEBUG" == 'true' ] && set -x

15
看一看:help -m set | less
Cyrus

4
感谢您的help -m set提示。这样可行。我man set在询问之前尝试过,但是在ubuntu上有No manual entry for set
Ole

2
@Ole set是bash内置的,因此如果您man bash可以在SHELL BUILTIN COMMANDS部分中找到它。在查看手册页时,您可以通过搜索以下正则表达式跳转至该手册页:\bset \[
User5910

Answers:


364

set -x启用外壳程序的一种模式,其中所有执行的命令都将打印到终端。在您的情况下,它显然是用于调试的,这是典型的用例set -x:在执行命令时打印每个命令,如果脚本未按预期运行,则可以帮助您可视化脚本的控制流。

set +x 禁用它。


5
如何再次禁用该功能?
feedc0de

85
@DanielBrunner:set +x禁用它。
John Zwinck

2
这非常有用!我希望有人早点告诉我。还有其他类似的有趣技巧可以提高我们的脚本元技能吗?
学生

7
@Student:set -e在脚本顶部,每当发生错误(并且未明确处理)时,脚本都会退出并显示错误。我发现这比默认值要好得多,默认值是随心所欲(例如Visual Basic的臭名昭著On Error Resume Next)。
John Zwinck

1
不幸的是,@ JohnZwinck set -e具有非常不希望的副作用,以至于几乎无法进行代码审查(因为给定行的行为取决于调用堆栈中的内容-如果在“检查”上下文中调用了函数,set -e则被禁用了)该调用及其依次调用的所有内容)。请参阅BashFAQ#105中的练习。
查尔斯·达菲

77

set -x

在扩展它们之前和执行它们之前,为命令,大小写命令,选择命令以及命令及其参数或关联的单词列表打印简单命令的痕迹。扩展PS4变量的值,并在命令及其扩展的参数之前打印结果值。

[ 来源 ]

set -x
echo `expr 10 + 20 `
+ expr 10 + 20
+ echo 30
30

set +x
echo `expr 10 + 20 `
30

上面的示例说明的用法set -x。使用时,上述算术表达式已被扩展。我们可以看到单线是如何逐步评估的。

  • 第一步expr已经过评估。
  • 第二步echo已经过评估。

要了解有关设置的更多信息,请访问此链接

当涉及到您的shell脚本时,

[ "$DEBUG" == 'true' ] && set -x

当执行模式选择为时,脚本可能正在打印一些其他信息行DEBUG。传统上,当脚本使用可选参数调用时,例如:-d



6

-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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.