`set -x`做什么?

Ole*_*Ole 206 unix linux bash scripting

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

[ "$DEBUG" == 'true' ] && set -x
Run Code Online (Sandbox Code Playgroud)

Joh*_*nck 290

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

  • @DanielBrunner:`set + x`禁用它. (68认同)
  • @Student:脚本顶部的`set -e`会使脚本在出现错误时退出(并且没有明确处理)。我发现它比默认值要好得多,默认值是随心所欲(例如Visual Basic臭名昭著的“ On Error Resume Next”)。 (6认同)
  • @JohnZwinck,不幸的是,“set -e”具有“非常”不良的副作用,以至于它使代码审查几乎不可能(因为给定行的行为取决于调用堆栈的情况 - 如果在“检查”上下文,该调用及其依次调用的所有内容都被禁用“set -e”)。请参阅 [BashFAQ #105](http://mywiki.wooledge.org/BashFAQ/105#Exercises) 中的练习。 (4认同)
  • 如何再次禁用该功能? (3认同)
  • 这非常有用!我希望有人早点告诉我。还有其他类似的有趣技巧可以提高我们的脚本元技能吗? (2认同)
  • @JohnZwinck,是的,但我不知道“rking”是谁。Greycat 是 BashFAQ 的作者,是 freenode IRC #bash 频道的频道长辈,等等——如果你要按权威争论,那么了解某个领域的权威是谁会很有帮助。是的,我绝对主张繁琐地检查每个命令的退出处理,就像 C 或 Go 或任何其他不支持异常的语言中需要的代码审查一样。依赖“set -e”就是依赖一些“不可靠”的东西。 (2认同)
  • 顺便说一句:这些消息被打印到 stderr,因此,如果您在 docker 容器内运行这样的脚本,这些消息将被解释为错误。:) (2认同)

Raj*_*aju 67

set -x

在命令,命令命令,选择命令以及命令及其参数或关联的单词列表在扩展之后和执行之前打印一系列简单命令.扩展PS4变量的值,并在命令及其扩展参数之前打印结果值.

set -x
echo `expr 10 + 20 `
+ expr 10 + 20
+ echo 30
30
Run Code Online (Sandbox Code Playgroud)
set +x
echo `expr 10 + 20 `
30
Run Code Online (Sandbox Code Playgroud)

上面的例子说明了它的用法set -x.使用它时,上面的算术表达式已经扩展.我们可以看到如何逐步评估单线.

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

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

说到shell脚本,

[ "$DEBUG" == 'true' ] && set -x
Run Code Online (Sandbox Code Playgroud)

选择执行模式时,您的脚本可能已经打印了一些额外的信息行DEBUG.传统上,人们习惯在使用可选参数调用脚本时启用调试模式-d

  • 报价来自https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html (3认同)

Rod*_*rry 12

-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
Run Code Online (Sandbox Code Playgroud)