Bash -x 或 set -x

14 浏览
0 Comments

Bash -x 或 set -x

在调试时,使用bash -x scriptname.sh和在脚本内使用set -x然后调用它有什么实际区别吗?

根据我的个人经验,我总是使用bash -x,因为这样我就不必更改脚本,所以它的干扰性较小。

是否有一种情况下bash -x不适用,而只有set -x适用?

我提出这些问题是因为我总是看到人们在帮助他人调试时建议使用set -x,我想知道为什么不用bash -x scriptname.sh。是否存在技术限制?

附注:我不是在问这些命令的功能,而是在问它们的“如何”以及它们是否有优劣之分。

关于它们的功能:

0
0 Comments

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
# 脚本的其他代码

无论选择哪种方式,都可以实现脚本的跟踪功能,帮助开发者调试和定位问题。

0
0 Comments

问题的原因是在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还是直接调用脚本解释器。

0
0 Comments

在调试脚本时,我建议用户使用set -x而不是bash -x

  • 用户完全希望修改脚本来修复错误,所以添加一行代码不成问题。
  • 你不需要知道用户如何运行他们的脚本(可能是通过某个构建脚本或IDE运行,而不仅仅是在终端中运行./foo)。
  • 你不需要确认shebang,因为#!/bin/bash -eui需要你运行bash -euix file,而#!/bin/sh需要sh -x file

但对于我自己来说?是的,我会直接运行bash -x

0