重定向和返回代码

重定向和返回代码

所以我有一个程序可能会或可能不会出现段错误(./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

相关内容