所以我有一个程序可能会或可能不会出现段错误(./segf)还将其他数据写入 stderr。当程序出现段错误时,其返回码是139(即echo $?
会打印139
)。
我想将 stderr 重定向到/dev/null
以避免打印它,但是这样做 ( ./segf 2>1
) 会导致返回代码设置为 1。现在无法区分程序是真正出现段错误还是只是返回错误。
是否可以通过管道传输 stderr 的其他错误,同时仍然能够检查返回代码是否为 139?
./segf >/dev/null; echo $?
结果 139
./segf >/dev/null 2>1; echo $?
结果为 1
bash -c './segf'
结果 139
bash -c './segf' 2>1
结果为 1
答案1
您尝试过的任何操作都不会影响退出状态。您可以使用这个非常简单的脚本进行测试:
#!/bin/sh
echo out
echo err >&2
exit 139
现在使用各种重定向来执行它:
$ foo.sh; echo $?
out
err
139
#redirect stdout to /dev/null and stderr to a file called '1'
$ foo.sh >/dev/null 2>1; echo $?
139
## Redirect stderr to /dev/null
$ foo.sh 2>/dev/null; echo $?
out
139
重定向命令的 stderr 的方法只是command 2>/dev/null
,但这永远不会影响命令的退出状态,除非重定向失败。这实际上就是您的案例中可能发生的情况。如果您在所在目录中没有写入权限,并且您尝试运行./segf >/dev/null 2>1
(而不是./segf >/dev/null 2>&1
),则会尝试创建一个文件调用1
将 stderr 重定向到。如果无法创建文件,您将获得退出状态1
:
$ foo.sh 2>1; echo $?
bash: 1: Permission denied
1