Bash -x 或 set -x
Bash -x 或 set -x
在调试时,使用bash -x scriptname.sh
和在脚本内使用set -x
然后调用它有什么实际区别吗?
根据我的个人经验,我总是使用bash -x
,因为这样我就不必更改脚本,所以它的干扰性较小。
是否有一种情况下bash -x
不适用,而只有set -x
适用?
我提出这些问题是因为我总是看到人们在帮助他人调试时建议使用set -x
,我想知道为什么不用bash -x scriptname.sh
。是否存在技术限制?
附注:我不是在问这些命令的功能,而是在问它们的“如何”以及它们是否有优劣之分。
关于它们的功能:
Bash的"-x"选项和"set -x"命令是实现相同功能的不同接口。可以在Bash的文档中查看相关信息。单字符选项可以在调用shell时使用,也可以在脚本中使用。
它们的区别在于,是在脚本的第一行之前设置它(使用"bash -x ./script.sh"命令),还是在脚本内部设置它(在脚本的任意位置使用"set -x"命令)。这两种方式都可以启用和禁用简单的跟踪功能,但是后面的"set"命令会覆盖前面的设置,即影响后续的代码行。除此之外,它们在功能上没有其他区别。
解决方法很简单,根据具体需求选择在脚本外部还是内部设置"-x"选项或"set -x"命令即可。根据需要来确定是在脚本调用时设置还是在脚本内部设置。设置的位置决定了跟踪功能的启用或禁用范围。
这两种方式的使用示例如下:
在脚本调用时设置"-x"选项:
bash -x ./script.sh
在脚本内部设置"set -x"命令:
#!/bin/bash set -x # 脚本的其他代码
无论选择哪种方式,都可以实现脚本的跟踪功能,帮助开发者调试和定位问题。
问题的原因是在shebang中避免使用多个参数的主要原因是严格来说,POSIX内核不需要支持多个参数。因此,#!/usr/bin/env bash -x
可能不起作用(例如,#!/bin/bash -x
可能会使用古老的bash版本在macOS上)。尽管如此,实际上许多类UNIX系统确实支持带有多个参数的shebang。
如果您在脚本的开头部分处理安全或密钥选项,但希望能够在以后进行调试,您可能希望为与安全相关的部分设置set +x
。但是,您始终可以使用set -x
,因此这不是一个特别可靠的避免使用bash -x
的原因。
鉴于OP说他们不必修改脚本,我猜他们正在询问运行bash -x myscript
而不是在shebang中添加-x
。
此外,shebang中的参数将被解释器的直接调用绕过,例如bash scriptname
。因此,在脚本中使用set -x
或任何其他shell选项,都保证该选项将按预期设置,无论是从shebang还是直接调用脚本解释器。