Command-Line
如何將輸出通過管道傳輸到另一個程序,但保留第一個程序的錯誤狀態?
可能重複:
我正在使用以下命令行(在 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 上。
我不確定 shell
sh.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 只執行一個帶有
pipefail
set 的命令,但我不知道。嘗試
SHELL=/bin/bash
在 Makefile 中添加(Make 應該使用它)或嘗試:
bash -o pipefail -c "$GCC_COMMAND | $PERL_COMMAND"