如何调试bash脚本?

乌鸦座

有什么方法可以调试bash脚本?例如,打印诸如“呼叫行1”,“呼叫行2”之类的执行日志的内容。

乔纳森·莱夫勒
sh -x script [arg1 ...]
bash -x script [arg1 ...]

这些使您可以了解正在执行的内容。(另请参见答案底部的“澄清”。)

有时,您需要在脚本中控制调试。在这种情况下,正如Cheeto 提醒我的那样,您可以使用:

set -x

这将打开调试。然后,您可以使用以下方法再次将其关闭:

set +x

(您可以通过分析$-的当前标志来找到当前的跟踪状态x。)

而且,shell通常提供选项' -n'表示'不执行'和' -v'表示'详细'模式。您可以将它们组合使用,以查看shell是否认为它可以执行脚本-如果某处的引用不平衡,这有时会很有用。


有争议的是-xBash中的' '选项与其他shell不同(请参见注释)。猛砸手册说:

  • -X

    在扩展它们之后,在执行之前,打印一些简单命令,for命令,case命令,select命令和算术for命令及其自变量或相关单词列表的痕迹PS4变量的值将被扩展,并在命令及其扩展的参数之前输出结果值。

这么多似乎根本没有表明不同的行为。-x在手册中看不到其他与“ 相关的参考它没有描述启动顺序中的差异。

说明:在诸如“ Linux”之类的系统上,其中“ /bin/sh”是指向“ /bin/bash的符号链接(或在任何找到Bash可执行文件的位置),这两个命令行具有在运行执行跟踪的情况下运行脚本的等效效果。在其他系统(例如Solaris和Linux的一些更现代的变体)上,/bin/sh它不是Bash,并且这两个命令行会(略有不同)产生不同的结果。最值得注意的是,“ /bin/sh”会被Bash中根本无法识别的构造所混淆。(在Solaris上/bin/sh是Bourne外壳;在现代Linux上,有时是Dash -一种较小的,更严格的POSIX专用外壳。)当这样命名时,在“ shebang”行(“ #!/bin/bash'vs '#!/bin/sh'

Bash手册中有关于Bash POSIX模式的部分,与该答案的长期存在但错误的版本相反(另请参见下面的评论),确实详细描述了“以Bash调用为sh”和“以Bash调用为Bash”之间的区别。bash'。

在调试(Bash)shell脚本时,使用带-x选项的shebang行中命名的shell将是明智且明智的,甚至是必要的否则,调试时和运行脚本时,您可能会(会?)得到不同的行为。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章