Shell-Script

列印/Tee 到控制台而不將輸出傳遞到管道

  • November 6, 2012

有沒有辦法將一個東西列印或 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

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