Bash
在管道中使用“ifne”——執行多個命令
在我的腳本中,我使用
ifne
了包中的實用moreutils
程序。該行可以簡化為以下內容:printf "asdf\n" | ifne cat - && echo "stream not empty"
ifne
僅當流非空時執行。但是,我怎樣才能使第二個命令(echo "stream not empty"
)也僅在流非空時才執行?例如,如何更改以下命令使其不列印“stream not empty”?printf "" | ifne cat - && echo "stream not empty"
用括號括
cat
起來echo
會產生語法錯誤:printf "" | ifne (cat - && echo "stream not empty")
僅當流非空時如何執行最後一個命令?
ifne
不會根據輸入是否為空來設置退出程式碼,因此&&
不會||
按預期工作。Babyy 答案的另一種方法是使用pee
同一個包:printf "asdf\n" | pee 'ifne cat -' 'ifne echo "stream not empty"'
這類似於
tee
,但將輸入流複製到多個管道中,將每個參數視為要執行的命令。(tpipe
是一個類似的命令,但行為略有不同。)但一個可能的問題是,每個命令可能會並行寫入標準輸出,這取決於緩沖和輸入/輸出的長度,輸出可能會交錯,或者因執行而異(實際上是一場比賽)。這可能可以使用
sponge
(相同的包)而不是cat
和/或其他緩衝/非緩衝解決方案來消除。它會影響您給出的範例,但可能不會影響您的實際案例。
使用這種格式:
printf "" | ifne sh -c "cat - ; echo 'stream not empty' "
輸出為無,並且:
printf "bb\n" | ifne sh -c "cat - ; echo 'stream not empty' "
輸出是:
bb stream not empty