Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux set-x是做什么的?_Linux_Bash_Unix_Scripting - Fatal编程技术网

Linux set-x是做什么的?

Linux set-x是做什么的?,linux,bash,unix,scripting,Linux,Bash,Unix,Scripting,我有一个shell脚本,其中包含以下行: [ "$DEBUG" == 'true' ] && set -x set-x启用shell模式,其中所有执行的命令都打印到终端。在您的情况下,它显然用于调试,这是set-x的典型用例:如果脚本没有按预期运行,则在执行时打印每个命令可以帮助您可视化脚本的控制流 set+x禁用它。set-x 打印简单命令的跟踪,对于命令、case命令,选择 命令和命令及其参数的算术或 展开后和展开前的关联单词列表 执行。PS4变量的值被展开,结果 值打印在

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

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

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

set+x
禁用它。

set-x
打印简单命令的跟踪,对于命令、case命令,选择 命令和命令及其参数的算术或 展开后和展开前的关联单词列表 执行。PS4变量的值被展开,结果 值打印在命令及其展开参数之前

[]

例子
上面的示例说明了
set-x
的用法。使用时,上述算术表达式已展开。我们可以看到如何一步一步地评估一条线

  • 已对第一步
    expr
    进行了评估
  • 第二步
    echo
    已被评估
了解更多关于set的信息→ 拜访

当涉及到shell脚本时

[ "$DEBUG" == 'true' ] && set -x
当执行模式选择为
DEBUG
时,脚本可能已经打印了一些额外的信息行。传统上,当使用可选参数调用脚本时,例如
-d

-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
感谢
help-m set
提示。这很有效。在询问之前,我尝试了
manset
,但是在ubuntu上,set@Ole没有手动输入,
set
内置在bash中,因此如果您
manbash
可以在SHELL内置命令部分找到它。查看手册页时,您可能可以通过搜索此regexp:
\b集跳转到手册页\[
man
用于非内置,而
help
用于shell内置。这非常有用!我希望有人早点告诉我。还有其他类似的有趣技巧可以提高我们的脚本元技能吗?@Student:
脚本顶部的set-e
会使脚本退出并出现错误无论错误发生(并且没有被明确处理)。我发现这比默认设置要好得多,默认设置是任性地继续(就像VisualBasic臭名昭著的《错误恢复下一步》)。@JohnZwinck,不幸的是,
set-e
有非常不希望的副作用,以至于几乎无法进行代码审查(因为给定行的行为取决于调用堆栈中的内容——如果在“选中”上下文中调用函数,
set-e
将禁用该调用以及它依次调用的所有内容)。请参阅中的练习。@JohnZwinck,是的,但我不知道谁是
rking
。Greycat是BashFAQ的作者,freenode IRC#bash频道的频道长老,等等——如果你要根据权限进行争论,了解某个领域的权限是有帮助的。是的,我绝对赞成冗长地检查每个命令的exit处理,正如C或Go或任何其他不支持异常的语言中的代码审阅所要求的那样。依赖
set-e
就是依赖一些根本不可靠的东西。顺便说一句:这些消息被打印到stderr,因此,如果您在docker容器中运行这样的脚本,这些消息将被解释为e错误:)
[ "$DEBUG" == 'true' ] && set -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