stdout을 화면에 유지하면서 파이프하는 방법은 무엇입니까? (및 출력 파일이 아님)


234

프로그램을 화면에 유지하면서 표준 출력을 파이프하고 싶습니다.

간단한 예를 들어 ( echo여기서는 설명 목적으로 만 사용하십시오) :

$ echo 'ee' | foo
ee <-보고 싶은 결과

티가 stdout을 파일로 복사 할 수는 있지만 그것이 내가 원하는 것이 아닙니다.
$ echo 'ee' | tee output.txt | foo

시도
$ echo 'ee' | tee /dev/stdout | foo했지만 티 출력 /dev/stdout이 파이프로 전달되었으므로 작동하지 않습니다.foo


6
참고 echo 'ee' | tee /dev/stderr사용자의 경우 작품,하지만 그래서 "화면의" 요구 사항이 너무 stderr에 의해 만족, 즉 할 수 있습니다.
nh2

답변:


344

다음은 POSIX표준 을 준수한다고 가정하고 모든 Unix / Linux 구현에서 작동하는 솔루션입니다 . 유닉스가 아닌 일부 환경 cygwin에서도 작동합니다 .

echo 'ee' | tee /dev/tty | foo

참조 : Open Group Base 사양 Issue 7 IEEE Std 1003.1, 2013 Edition, §10.1 :

/ dev / tty

해당 프로세스의 프로세스 그룹과 연관됩니다 (있는 경우). 출력이 재 지정된 방식에 관계없이 터미널에 메시지를 쓰거나 터미널 에서 데이터를 읽으 려는 프로그램 또는 쉘 프로 시저에 유용합니다 . 또한 형식화 된 출력이 필요할 때 현재 사용중인 터미널을 찾는 것이 번거로운 경우 출력을 위해 파일 이름을 요구하는 응용 프로그램에도 사용할 수 있습니다. 각 프로세스에서 제어 터미널의 동의어

Google Colab과 같은 일부 환경 에서는 사용 가능한 장치를 반환하는 명령 을 실행 /dev/tty하면서 구현하지 않는 것으로보고되었습니다 tty. 해결 방법은 다음과 같습니다.

tty=$(tty)
echo 'ee' | tee $tty | foo

또는 고대 Bourne 껍질로 :

tty=`tty`
echo 'ee' | tee $tty | foo

5
@static_rtti 왜 당신은 당신의 코멘트에 나의 해답을 해마다 무시하고 있는가?
jlliagre

1
@PaulBissex /dev/tty는 필수 유닉스 장치입니다. BSD 감옥에서 달리고 있습니까?
jlliagre

1
@PaulBissex 구현 또는 구성 버그입니다. / dev가 마운트되어 있습니까? "ls -l / dev / tty / dev / tty * / dev"는 무엇입니까? lists.freebsd.org/pipermail/freebsd-bugs/2012-November/…를 참조하십시오.
jlliagre

1
그리고 당신은 다음 tee과 같이 계단식으로 배열 할 수 있습니다 : cat some.log | tee /dev/tty | tee -a other.log | grep -i 'foo' >> foo.log1) 콘솔에 모두 가져 오기, 2) 다른 파일에 모두 추가, 3) 다른 파일에 foo줄 가져 오기 .
Jesse Chisholm

1
Google Colab에는이 /dev/tty없지만 출력 tty은 사용할 수 있습니다.
Tom Hale

69

시도해야 할 또 다른 것은 :

echo 'ee' | tee >(foo)

>(foo)A는 프로세스 교체 .


1
foo의 출력을 다른 막대에 파이프하려면 어떻게해야합니까?
Jack Tang

3
@ JackTang-출력에 대한 추가 파이프 foo는 프로세스 대체의 일부 여야 한다고 생각합니다 . 예를 들면 다음과 같습니다.echo 'ee' | tee file.txt >(wc -c | tr -d ' ')
Nick Chammas

1
이것은 FreeBSD (/ dev / tty 아님)에 대한 해결책이었습니다
Paul Bissex

9
@Nick Chammas, 정상적인 파이프 라인을 유지하기 위해 tee의 출력을 바꿀 수 있습니다 echo 'ee' | tee >(cat) | foo | bar.
Vaelus

18

일부 시스템에서는 "/ dev / stdout"에 대한 액세스가 거부되었지만 사용자 터미널에 대한 액세스는 "/ dev / tty"에 의해 제공됩니다. "foo"에 "wc"를 사용하면 위 예제는 다음과 같이 작동합니다 (Linux, OSX 등에서).

% echo 'Hi' | tee /dev/tty | wc Hi 1 1 3

일치하는 파일 목록의 맨 아래에 개수를 추가하려면 다음과 같이 사용하십시오.
% ls [A-J]* | tee /dev/tty | wc -l

이 모든 것을 기억하지 않으려면 별칭을 정의합니다.
% alias t tee /dev/tty
% alias wcl wc -l

간단하게 말할 수 있도록
% ls [A-J]* | t | wcl


POSTSCRIPT : 발음이 "titty"로 쓰러 질 수있는 더 어린 세트의 경우, "tty"는 한때 "teletype"터미널의 일반적인 약어라고 덧붙였습니다. 붙어.


17

시험:

$ echo 'ee' | tee /dev/stderr | foo

물론 stderr을 사용하는 것이 옵션이라면.


8

먼저 화면과 관련된 터미널 (또는 출력을 표시하려는 화면)을 알아야합니다.

tty

그런 다음 출력을 해당 터미널에 티잉하고 다른 사본을 foo 프로그램을 통해 파이프 할 수 있습니다.

echo ee | tee /dev/pty/2 | foo

1
oneliner : t = $ (tty) 에코 ee | 티 $ t | foo | 바
Jack Tang

5
@JackTang 정말 나아졌지 만 t쓸모가 없습니다. 사용할 수는 echo ee | tee $(tty) | foo있지만 여전히 쓸모없는 명령이 있습니다 (tty 실제로 /dev/tty작동 한다는 점에서 )이 있습니다.
jlliagre
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.