Shell-Script
列印/Tee 到控制台而不將輸出傳遞到管道
有沒有辦法將一個東西列印或 tee 到控制台,並且仍然將其他東西傳遞到下一個管道?就像是:
echo dog | printOrWhatnot "PUTTING MY THING DOWN" | sed 's/dog/cat/g' | printOrWhatnot "FLIP IT"|rev
這將導致:
PUTTING MY THING DOWN FLIP IT tac
**編輯:**這也應該適用於多行輸入:
printOrWhatNot() {...} seq 10 30 |printOrWhatNot searching for 3s | grep 3
會輸出
searching for 3s 13 23 30
拉斯的回答似乎只傳遞了第一個輸入(這裡是
10
)理想情況下,輸出將在處理期間內聯,這不是我在 Glen 的回答中看到的。所以
seq 10 30 |tee /dev/tty |printOrWhatNot searching for 3s | grep 3
將有助於:
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 searching for 3s 13 23 30
我不知道任何用於此目的的標準命令,但很容易在一個小 shell 腳本中製作你自己的命令。創建以下內容,使其可執行,並將其位置添加到您的 PATH。
編輯——更新以處理多行標準輸入,並處理輸入中的空格。
列印或什麼:
#!/bin/bash # printOrWhatnot script, to re-pipe stdin, while echoing something else via stderr # read stdin (possibly multi-lined) into $my_array[]: while read -t 1 piped do my_array=("${my_array[@]}" "$piped") done # echo the supplied arguments by sending them to stderr: echo "$@" 1>&2 # now spew $my_array[], line by line, to any further processing: arrayLen=${#my_array[@]} for (( i=0; i<$arrayLen; i++ )); do echo ${my_array[$i]} done
現在它應該按照您的建議工作:
myhost> echo dog | printOrWhatnot "PUTTING MY THING DOWN" | sed 's/dog/cat/g' | printOrWhatnot "FLIP IT"|rev PUTTING MY THING DOWN FLIP IT tac