我希望能够创建一个bash函数,可以在管道之前读取命令的退出代码。我不确定是否可以访问它。
echo "1" | grep 2
返回1状态代码echo "1" | grep 1
返回0状态代码现在我想添加第三个命令来读取状态,使用管道:
echo "1" | grep 2 | echo $?
将回显“0”,即使状态代码为1。我知道我可以使用echo "1" | grep 2 && echo "0" || echo "1"
,但我更愿意使用管道来编写它。
无论如何他们都这样做(如果它在大多数shell上工作会更好,比如bash,sh和zsh)
答案 0 :(得分:3)
您必须在管道的下一个阶段之前获得退出状态。像
这样的东西exec 3> debug.txt
{ echo "1"; echo "$?" >&3; } | long | command | here
您无法(轻松)将其封装在函数中,因为它需要传递正确引用的字符串并通过eval
执行它:
debug () {
eval "$@"
echo $? >&3
}
# It looks easy in this example, but it won't take long to find
# an example that breaks it.
debug echo 1 | long | command | here
您必须将退出状态写入不同的文件描述符,否则会干扰发送到管道中下一个命令的输出。
答案 1 :(得分:1)
在bash中,您可以使用PIPESTATUS
变量
echo "1" | grep 1
echo ${PIPESTATUS[0]} # returns 0
echo "1" | grep 2
echo ${PIPESTATUS[0]} # returns 0
echo "1" | grep 2
echo ${PIPESTATUS[1]} # returns 1