Bash

在管道中使用“ifne”——執行多個命令

  • April 20, 2021

在我的腳本中,我使用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

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