从 stdout 设置 shell 变量*或* 如果命令失败则回退

nat*_*evw 1 bash sh

我的脚本调用外部命令(例如readlink),它将:

\n\n
    \n
  • 成功时将有用的字符串写入其标准输出,或\xe2\x80\xa6
  • \n
  • 失败时返回非零退出状态
  • \n
\n\n

我知道如何单独执行每个操作,例如捕获我可以使用的标准输出

\n\n
MY_VAR=$(readlink /)\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者检查结果我可以使用:

\n\n
if readlink /tmp; then\n   echo "Success"\nfi\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是有没有一种干净/清晰的方法可以同时执行 \xc2\xb1 呢?我不确定以下内容是否有效:

\n\n
if MY_VAL=`readlink "$MY_ARG"`; then\n    echo "Value is ${MY_VAL}"\nelse\n    echo "Not found"\nfi\n
Run Code Online (Sandbox Code Playgroud)\n\n

更新:所以我尝试了,而且确实如此有效。但这仅仅是巧合吗,例如,由于 readlink 的输出在出错的同时为空,所以恰好可以工作?

\n\n

作为一个特定的限制,我需要在一个环境中执行此操作set -e指定的环境中执行此操作,即如果其他命令返回错误,则整个脚本将失败。首选通用 shell,除非 bash 有更好的机制。

\n

Kam*_*Cuk 5

只是:

if MY_VAR=$(readlink /); then
   echo "Success"
fi
Run Code Online (Sandbox Code Playgroud)

命令替换返回状态是最后执行的命令的返回状态(或者内部执行的子shell的返回状态)。因此$(true; false;)返回非零状态。具有命令替换的行的返回状态等于最后执行的命令。所以:

 a=$(true)$(false)
Run Code Online (Sandbox Code Playgroud)

将始终返回非零返回状态。但:

 a=$(false)$(true)
Run Code Online (Sandbox Code Playgroud)

将返回零返回状态,因为最后执行的命令替换命令是true返回零状态的命令。

在脚本中if var=$(...); then,允许在保存标准输出的同时检查命令的返回状态是很正常的。

不要使用反引号`。它们与 相同,$( .. )但可读性较差,不能嵌套并且已弃用