我的脚本调用外部命令(例如readlink),它将:
我知道如何单独执行每个操作,例如捕获我可以使用的标准输出
\n\nMY_VAR=$(readlink /)\nRun Code Online (Sandbox Code Playgroud)\n\n或者检查结果我可以使用:
\n\nif readlink /tmp; then\n echo "Success"\nfi\nRun Code Online (Sandbox Code Playgroud)\n\n但是有没有一种干净/清晰的方法可以同时执行 \xc2\xb1 呢?我不确定以下内容是否有效:
\n\nif MY_VAL=`readlink "$MY_ARG"`; then\n echo "Value is ${MY_VAL}"\nelse\n echo "Not found"\nfi\nRun Code Online (Sandbox Code Playgroud)\n\n更新:所以我尝试了,而且确实如此有效。但这仅仅是巧合吗,例如,由于 readlink 的输出在出错的同时为空,所以恰好可以工作?
\n\n作为一个特定的限制,我需要在一个环境中执行此操作set -e指定的环境中执行此操作,即如果其他命令返回错误,则整个脚本将失败。首选通用 shell,除非 bash 有更好的机制。
只是:
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,允许在保存标准输出的同时检查命令的返回状态是很正常的。
不要使用反引号`。它们与 相同,$( .. )但可读性较差,不能嵌套并且已弃用。