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

时间:2019-03-14 08:04:56

标签: 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="$?"

3 个答案:

答案 0 :(得分:1)

尝试一下:

set -e
false || echo $? && echo 0

即使false以1退出,您也可以在中间(使用$?)捕获此退出值,而不会中止整个脚本。

如果脚本(false)没有失败,则退出代码始终为零,因此成功时只需将零设置为空。

答案 1 :(得分:1)

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

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

变量分配不是命令。

因此,您可以执行set -e脚本中流行的操作:

formoutput=$(yad ...) || ret=$? && ret=$?

捕获返回值。

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

formoutput=$(yad ...) ||:

||:实际上是使用:命令的||。 Colon命令返回退出状态为零,命令列表a || b的退出状态是列表中最后执行的命令的退出状态,因为:总是返回零,命令列表将返回还返回零退出状态。

或使用if

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

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

if true; then
    false
fi

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

答案 2 :(得分:0)

我需要以其他顺序使用运算符才能使它工作

$ set -e
$ true || status=$? && status=$?; echo $status
0
$ false || status=$? && status=$?; echo $status
0
$ true && status=$? || status=$?; echo $status
0
$ false && status=$? || status=$?; echo $status
1