如果反引号运算符失败,我如何打印和退出 bash

spr*_*aff 5 bash

我有getinfo.sh打印信息或以代码 1 存在的信息。

我想将此脚本的结果存储在 bash 变量中,否则打印错误消息并退出。

如果我运行这个

#!/bin/bash
X=`getinfo.sh` || echo "failed" && exit 1
Run Code Online (Sandbox Code Playgroud)

然后脚本即使getinfo.sh成功也会退出(在这种情况下它不打印任何内容。

另一方面

X=`getinfo.sh` || (echo "failed" && exit 1)
Run Code Online (Sandbox Code Playgroud)

这对我来说很有意义,来自类 C 语言,但这并没有退出脚本,因为括号创建了一个新的内壳,而退出的是内壳,外壳继续运行。

getinfo.sh如果失败,如何存储和打印并退出的输出?

Sté*_*las 5

(...)不是(主要)对命令进行分组,而是启动子shell。所以exitin(echo failed && exit 1)只退出子shell。

要对命令进行分组而不在子 shell 中运行它们,您可以使用{ ...; }

X=`getinfo.sh` || {
  echo >&2 "failed"
  exit 1
}
Run Code Online (Sandbox Code Playgroud)

虽然在这里,我宁愿使用:

if ! x=$(getinfo.sh); then
  echo >&2 failed
  exit 1
fi
Run Code Online (Sandbox Code Playgroud)

另请注意,echo failed && exit 1如果echo标准输出是完整文件系统上的文件,或者忽略 SIGPIPE 的管道损坏,或者标准输出已关闭,或者 SIGXFSZ 已达到文件大小限制无视...


Mat*_*ock 0

最简单的方法是将 -e 添加到你的 shebang 中:

#!/bin/bash -e

这意味着脚本将在出现第一个错误时停止。由于您使用反引号,因此如果有任何错误消息,您可能会在标准输出中看到它。

如果您确实想使用 echo-and-exit 方法,我会编写一个单独的函数来调用,它总是打印一些错误消息并立即退出。了解如何编写 bash 函数(它们非常简单)。