Command-Line

如何將輸出通過管道傳輸到另一個程序,但保留第一個程序的錯誤狀態?

  • December 2, 2011

可能重複:

獲取通過管道傳輸到另一個程序的退出程式碼

我正在使用以下命令行(在 makefile 中)通過 perl 腳本將來自編譯器的詳細錯誤消息通過管道傳輸,該腳本將它們簡化為人類可讀的內容:

g++ -c source.cpp -o source.o 2>&1 | perl /bin/gSTLFilt.pl

不幸的是,這種方法“掩蓋”了g++命令返回的錯誤值。make 不知道g++命令是否失敗,因為它返回的只是perl命令的錯誤結果。

有沒有辦法管道輸出,並且仍然保留原始錯誤條件?

如果它有所作為:我在執行 GNU bash 版本 2.04.0(1)-release (i686-pc- msys) 在 Windows XP 上。

我不確定 shellsh.exe提供了什麼(因為有多個 shell 使用該名稱作為其 Windows 執行檔),但如果是bash或類似的,您可以使用該$PIPESTATUS數組。對於您的範例,您將執行以下操作:

g++ -c source.cpp -o source.o 2>&1 | perl /bin/gSTLFilt.pl
echo "${PIPESTATUS[0]}"

Bash 有一個選項pipefail

The return status of a pipeline is the exit status of the last command,
unless  the  pipefail  option  is enabled.  If pipefail is enabled, the
pipeline's return status is the value of the last  (rightmost)  command
to  exit  with a non-zero status, or zero if all commands exit success-
fully.

所以:

set -o pipefail && $GCC_COMMAND | $PERL_COMMAND

Make 為每一行執行子shell 中的每一行,因此您需要將其添加到 gcc 行的開頭。可能有一種方法可以讓 make 只執行一個帶有pipefailset 的命令,但我不知道。

嘗試SHELL=/bin/bash在 Makefile 中添加(Make 應該使用它

或嘗試:

bash -o pipefail -c "$GCC_COMMAND | $PERL_COMMAND"

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