파이프 명령에서 tee를 사용할 때 이상한 출력이 발생합니다.

파이프 명령에서 tee를 사용할 때 이상한 출력이 발생합니다.

내 작업에서 다음 명령을 사용해야 합니다.

who|tee test|wc -l

내 시스템의 출력은 다음과 같습니다. 이는 2명의 사용자가 연결되었음을 의미합니다.

2

who화면에 출력이 나오지 않고 출력도 나오지 않습니까 wc -l? tee출력을 화면에 기록하는 동시에 동일한 출력을 가진 파일을 생성한다고 생각했습니까 ?

who그러나 내 파일에서 "시험”, 하지만 여전히 나에게는 이해가 되지 않습니다.

답변1

파이핑의 효과는 tee첫 번째 명령이 무엇이든 기록한다는 것입니다.표준 출력파일(이름이 명령줄 인수로 전달됨 tee)과 tee명령의 표준 출력에 씁니다. 파이프가 계속되지 않고 명령에 대한 리디렉션을 수행하지 않으면 의 tee표준 tee출력은 셸(일반적으로 터미널)의 표준 출력입니다.

이것이 바로 running who과 running이 who | tee test터미널에 동일한 텍스트를 표시하는 이유입니다. 당신과의 차이점은 tee파일에 쓰는 것입니다.

파이프가 계속되면 who | tee test | wc -l터미널에 기록된 모든 표준 출력이 파이프의 다음 명령으로 전송됩니다. 이는 와 달리 입력을 표준 출력(또는 다른 곳)에 복사하지 않는 wc명령 입니다 . 대신 통계를 표시합니다. 해당 옵션을 사용하면 행 수만 표시되므로 표시되는 전부입니다.teewc-l

2그러니 그것만 보는 이유 who | tee test | wc -l와 그것만 보는 이유는 같다. 이 명령은 출력을 파일에 기록하지만 다음과 같은 경우가 아니면 터미널에 인쇄하지 않습니다.2who | wc -lteewho그것은표준 출력은 터미널입니다. 이는 일반적으로 기본적으로 적용되지만 다른 명령으로 파이프하는 경우에는 적용되지 않습니다.

|파이프의 다음 명령에 대한 입력으로 사용되는 대신 출력이 터미널에 표시되는 명령이 왼쪽에 표시되면 아마도 다음과 같이 쓰고 있는 것입니다.표준 에러표준 출력 대신.

답변2

tee입력을 복사하여 파일에 저장하고표준 출력. 거기에서표준 출력wc... 로 옮겨진다표준 입력을 위한 wc. wc개수만 반환되며, 개수에 대한 입력 데이터는 에코되지 않습니다.

이해하고 싶다면 cmd1 | tee file | cmd2다음과 같은 효과가 있다고 생각하면 됩니다.

cmd1 > file
cat file | cmd2

이건 아닌데실제로그러나 명령을 실행하는 사람의 관점에서는 동일하게 보일 것입니다( cmd1모든 것이 거의 동시에 발생한다는 인상을 줄 만큼 빠르다면). 실제로 데이터를 수신하는 동안 데이터를 채웁니다 file.cmd2

답변3

두 개를 동시에 보고 싶다who 그리고 wcdo의 출력 bash:

who | tee >(wc -l) test

산출:

me       tty7         2017-10-16 18:17 (:0)
1

콘텐츠 포함시험.

관련 정보