programing

화면에 stdout을 유지하면서 파이프에 연결하는 방법(출력 파일이 아님)

jooyons 2023. 4. 25. 22:17
반응형

화면에 stdout을 유지하면서 파이프에 연결하는 방법(출력 파일이 아님)

프로그램에 대한 표준 출력을 화면에 유지한 채 파이프로 연결하고 싶습니다.

예시를 들자면요.echo여기서 사용하는 것은 설명을 위한 것일 뿐입니다.

$ echo 'ee' | foo
ee 출력물을 보고 싶습니다.

TE가 stdout을 파일에 복사할 수 있다는 건 알지만 그건 내가 원하는 게 아니에요.
$ echo 'ee' | tee output.txt | foo

저는 노력했어요.
$ echo 'ee' | tee /dev/stdout | foo그런데 티 출력이 안 돼요./dev/stdout파이프로 연결되어 있습니다.foo

은 Unix/Linux 구현에서 할 수 있는 솔루션입니다. Unix/Linux는 Unix/Linux를 따라야 합니다.POSIX표준.다음과 같은 Unix 이외의 일부 환경에서 작동합니다.cygwin

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

참조:개방형 그룹 기반 사양 제7호 IEEE 규격 1003.1, 2013년판, §10.1:

/dev/tty입니다.

해당 프로세스의 프로세스 그룹(있는 경우)과 연결됩니다.기능은 출력이 리디렉션된 방식에 관계없이 터미널에 메시지를 쓰거나 단말기에서 데이터를 읽기를 원하는 프로그램이나 셸 프로시저에 유용합니다.또한 입력된 출력이 필요하고 현재 사용 중인 터미널을 찾는 것이 귀찮을 때 출력에 파일 이름을 요구하는 응용 프로그램에도 사용할 수 있습니다.각 프로세스에서 제어 터미널의 동의어입니다.

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

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

고대 본의 조개껍데기를 가지고 있을 수도 있죠

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

또 다른 시도는 다음과 같습니다.

echo 'ee' | tee >(foo)

»는 다음과 같습니다.>(foo)프로세스 대체입니다.

편집합니다.
좀 더 명확하게 하기 위해 (.) 여기서 출력이 리디렉션되는 현재 터미널에 대한 새 하위 프로세스를 시작합니다.

echo ee | tee >(wc | grep 1)
#              ^^^^^^^^^^^^^^ => child process

하위 프로세스의 변수 선언/변경 사항이 상위 프로세스에 반영되지 않는다는 점을 제외하면 하위 프로세스에서 명령을 실행하는 것과 관련하여 우려할 사항이 거의 없습니다.

시도해 보십시오.

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

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

일부 시스템에서는 "/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"라는 발음에 킥킥거리는 젊은 층을 위해, 저는 "ttty"가 한때 노란색 종이 롤을 사용하고 종종 고정된 둥근 키를 가진 "teletype" 단말기의 일반적인 줄임말이었다고 덧붙입니다.

먼저 화면(또는 출력을 표시할 화면)과 연결된 터미널을 파악해야 합니다.

tty

그런 다음 출력을 해당 단자에 티하고 다른 복사본을 foo 프로그램에 파이프로 연결할 수 있습니다.

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

언급URL : https://stackoverflow.com/questions/5677201/how-to-pipe-stdout-while-keeping-it-on-screen-and-not-to-a-output-file 입니다.

반응형