Linux

管道中命令的返回碼

  • October 16, 2013

以下腳本在 Solaris 上使用*/bin/ksh執行,在 Linux 上使用/bin/sh執行*

cmd | tee -a  cmd.log | tail
exit $?

cmd的輸出保存在文件cmd.log中,最後一行顯示在 stdout.

的目的是使用cmdexit $?的返回碼退出腳本。當然這個

不起作用,因為$?保存了管道中最後一個命令的返回碼,即

tail.

解決方法(我將省略所有清理活動):

{ cmd;  echo $? >  error.file; } | tee -a  cmd.log | tail
exit `cat error.file`

但是有沒有另一種方法來獲取cmd的返回碼並避免創建像error.file這樣的文件?

試試這個:

(cmd; echo $? 1>&2) | tee -a  cmd.log | tail

或者,如果您想將 STDERR 重定向到 tee:

exec 3>&1; (cmd 2>&1; echo $? >&3 3>&-)| tee -a  cmd.log; exec 3>&-

引用自:https://unix.stackexchange.com/questions/96308