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

bash-如何在使用set-e时处理退出代码并获取命令的输出,bash,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 var

我在脚本顶部设置了
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="$?"
试试这个:

set -e
false || echo $? && echo 0
<> > <代码> false <代码>退出1,您可以在中间捕获此退出值(使用<代码> $ <代码>),而不放弃整个脚本。


如果脚本(
false
)没有失败,则退出代码始终为零,这样您就可以在成功时为零。

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

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

变量赋值不是命令

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

formoutput=$(yad ...) || ret=$? && ret=$?
获取返回值

也可以通过调用
命令忽略退出:

formoutput=$(yad ...) ||:
| |:
实际上是带有命令的
|
。冒号命令返回零的退出状态,命令列表的退出状态
a | | b
是列表中执行的最后一个命令的退出状态,因为
始终返回零,命令列表也将返回零退出状态

或在以下情况下使用

if ! formoutput=$(yad ...); then 
          echo "AAAA! yad failed! abort ship!" >&2
fi
请注意,
if
命令还具有最后执行的命令的退出状态。因此,请注意:

if true; then
    false
fi

将从您的
集合-e
脚本退出。

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

$ 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

对于示例代码中没有的其他命令,我就是这样做的。捕获命令和退出代码的输出时出现问题。?它只是
formoutput=$(..)| | echo$?&&echo 0
表达式的退出状态是最后执行的命令的返回状态。变量赋值不是命令执行。因此
formoutput=$(bla)
的退出状态将是命令
bla
的退出状态。你可以把它锁起来<代码>如果a=$(真);然后回波1;else-2;fi
@KamilCuk谢谢。我被困在尝试类似但内部的()