Bash

失敗後如何繼續級聯管道命令

  • June 23, 2020

我正在執行一個命令並使用我自己的腳本操作輸出,但我不希望主命令在我的腳本失敗時停止。

例如:

a-command | tee logfile.txt | myscript

當我的腳本中途失敗時,我查看 logfile.txt,我發現它在我的腳本停止工作的地方中斷了,但我想要的是讓 a-commmand 繼續並且 logfile.txt 擁有完整的日誌,這樣我就可以調試我的腳本並修復錯誤。

有什麼方法可以修改我的命令以將最後一個管道部分視為可選或在出現錯誤時忽略,以便前兩個部分(命令和 tee)完成它們的工作。

$$ EDIT $$ a-command是一項漫長的任務,我的腳本基本上是在命令執行時操縱輸出以更好地報告狀態。所以我不想在a-command完成工作後執行我的腳本。

a-command | tee logfile.txt | { myscript; cat >/dev/null; }

這將首先像往常一樣執行您的管道,直到myscript終止(無論出於何種原因)。那時,cat將接管讀取,tee直到沒有更多數據到達。讀取的數據cat通過管道將其丟棄到/dev/null.

如果a-command在沒有myscript先結束/失敗的情況下完成,myscript將無法讀取更多數據並且可能會終止(?)。在myscript終止點cat開始,但由於沒有更多數據要讀取,它將立即終止並且管道將完成。


解決 TooTea關於確保我們仍然獲得管道的正確退出狀態的評論:

a-command | tee logfile.txt | ( myscript; err=$?; cat >/dev/null; exit "$err" )

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