태그 보관물: stdout

stdout

stdout을 화면에 유지하면서 파이프하는 방법은 무엇입니까? (및 출력 파일이 아님) ( echo여기서는 설명 목적으로 만 사용하십시오)

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

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

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

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

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



답변

다음은 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


답변

시도해야 할 또 다른 것은 :

echo 'ee' | tee >(foo)

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


답변

일부 시스템에서는 “/ 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”터미널의 일반적인 약어라고 덧붙였습니다. 붙어.


답변

시험:

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

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


답변

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

tty

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

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


답변