출력을 파이프로 연결하지 않고 콘솔에 /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

Lars의 답변은 첫 번째 입력만 전달하는 것 같습니다(여기서는 10).

또한 이상적으로는 처리 중에 출력이 인라인될 것입니다. 이는 Glenn의 답변에서 본 것과는 다릅니다. 그래서

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

답변1

나는 이 목적을 위한 표준 명령을 알지 못하지만 작은 쉘 스크립트를 사용하여 직접 작성하는 것은 쉽습니다. 다음을 생성하여 실행 가능하게 만들고 해당 위치를 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

답변2

stdout이 아닌 다른 파일 설명자로 메시지를 보낸 다음 stdin을 변경하지 않고 stdout으로 덤프해야 합니다.

printOrWhatnot() { echo "$@" >&2; cat -; }

(결국) 표준 출력에 메시지가 나타나도록 하려면 파이프를 중괄호 rev로 변경하거나 감싸십시오.rev 2>&1

{
    echo dog | 
    printOrWhatnot "PUTTING MY THING DOWN" | 
    sed 's/dog/cat/g' | 
    printOrWhatnot "FLIP IT" |
    rev
} 2>&1 

관련 정보