当'set -e'处于活动状态时,Bash获取命令的退出状态?

Dav*_*ver 49 bash

我通常-e在我的Bash脚本中设置,但偶尔我想运行一个命令并获得返回值.

没有做set +e; some-command; res=$?; set -e舞蹈,我怎么能这样做?

Adr*_*rth 63

bash手册:

如果失败的命令是在&&或||中执行的任何命令的一部分,则shell不会退出 清单[...].

那么,就这样做:

#!/bin/bash

set -eu

foo() {
  # exit code will be 0, 1, or 2
  return $(( RANDOM % 3 ))
}

ret=0
foo || ret=$?
echo "foo() exited with: $ret"
Run Code Online (Sandbox Code Playgroud)

示例运行:

$ ./foo.sh
foo() exited with: 1
$ ./foo.sh
foo() exited with: 0
$ ./foo.sh
foo() exited with: 2
Run Code Online (Sandbox Code Playgroud)

这是做这件事的规范方式.

  • 如果命令成功,您可能希望在执行此操作之前初始化ret = 0.他们中的一些人:) (6认同)
  • 或者,可以这样做:`foo || ret=$? ; echo "foo() 退出:${ret:-0}"` (2认同)

Kit*_*YMG 14

作为备选

ans=0
some-command || ans=$?
Run Code Online (Sandbox Code Playgroud)


Phi*_*ler 6

也许尝试在子shell中运行有问题的命令,像这样?

res=$(some-command > /dev/null; echo $?)
Run Code Online (Sandbox Code Playgroud)