bash - 使用 set -e 时如何处理退出代码并获取命令的输出

Leo*_*Mew 5 bash

set -e在脚本的顶部。如何避免某些命令和进程退出代码的脚本终止?我在遵循代码示例时遇到困难:
我需要输出到变量和退出代码,但这并不set -e容易。

set -e
...
formoutput=$(yad --form --field="Subdomain" --field="Domain" --field="Web master username" \
  --field="Apache group" --field='Webroot' \
  --field='Webroot variables - ${homedir}(of webmaster) ${subdomain} ${webmaster} ${domain}:LBL' \
  --field="Virtualhost ip or domain" \
  --field="Virtualhost port" --field="Server admin email" \
  --field="Create mysql user&db:CHK" \
  --button="Cancel:3" --button="Save defaults:2" --button="Create:0" \
  --title="Create apache virtualhost" \
  --text='Subdomain are case sencetive for Webroot folder ${subdomain} variable' \
  --focus-field=1 --center --window-icon="preferences-system" --width=600 \
  "${config[subdomain]}" "${config[domain]}" "${config[webmaster]}" "${config[webgroup]}" \
  "${config[webroot]}" "test" "${config[virtualhost]}" "${config[virtualport]}" "${config[serveradmin]}" 1)
formbutton="$?"
Run Code Online (Sandbox Code Playgroud)

Kam*_*Cuk 4

您需要处理命令的退出代码。

命令的退出状态是最后执行的命令的退出状态。

变量赋值不是命令。

所以你可以做脚本中流行的事情set -e

formoutput=$(yad ...) || ret=$? && ret=$?
Run Code Online (Sandbox Code Playgroud)

捕获返回值。

:或者您可以通过调用命令来忽略退出:

formoutput=$(yad ...) ||:
Run Code Online (Sandbox Code Playgroud)

确实||:||:命令的。冒号命令返回零退出状态,命令列表的退出状态a || b是列表中最后执行的命令的退出状态,因为:总是返回零,命令列表也将返回零退出状态。

或者使用if

if ! formoutput=$(yad ...); then 
          echo "AAAA! yad failed! abort ship!" >&2
fi
Run Code Online (Sandbox Code Playgroud)

请注意,该if命令还具有最后执行的命令的退出状态。所以请注意:

if true; then
    false
fi
Run Code Online (Sandbox Code Playgroud)

将从您的set -e脚本中退出。