set -eux 代替 set -x 在 Bash 配置文件中进行全局调试

8 bash debugging

当我使用 Bash 时,我喜欢使用突出的调试模式,所以每次我得到一台新机器时,我都会添加到~/.profile代码的末尾set -x

我也考虑添加eu,因此set -eux作为“最佳实践”。

如果我正确理解了BR 手册

  1. e 给了我不执行代码的好处,这些代码最终会返回一个非零(通常是错误的)输出。
  2. u - 我不太明白,男人说:

执行参数扩展时,将未设置的变量和特殊参数 '@' 或 '*' 以外的参数视为错误。错误消息将写入标准错误,并且非交互式 shell 将退出。

在我看来,这听起来很像,e但也将未设置的变量视为导致错误的变量,并以非零值退出。

对于寻求最佳“典型”调试的人来说,我在这里的理解是否准确并且set -euxset -x一般情况下更好?

Ste*_*itt 16

这是一个见仁见智的问题,但我认为set -eu对于交互式使用来说是个坏主意。以下是每个人的作用:

  • set -e每当pipelinelist复合命令以非零状态退出时,都会导致 shell 退出;
  • set -u 每当 shell 试图扩展一个未定义的参数时,它就会导致 shell 退出。

在交互式 shell 中,这意味着命令中的任何错误都会导致 shell 退出!例如,命令名称中的拼写错误、rm文件名不正确或echo $blah变量名不正确...

set -e并且set -u在编写 shell 脚本时很有用。特别是,set -e避免了复合错误:一旦命令失败,脚本就会退出,这可以避免后续命令不会在他们期望的上下文中运行的麻烦。

与您的解释相比,请注意,这-e并不能保护您免于执行会返回非零状态的代码;必须执行命令才能返回非零状态。