![stdout이 파이프될 때 프로그램은 어떻게 터미널에 출력됩니까?](https://linux55.com/image/179744/stdout%EC%9D%B4%20%ED%8C%8C%EC%9D%B4%ED%94%84%EB%90%A0%20%EB%95%8C%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8%EC%9D%80%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%ED%84%B0%EB%AF%B8%EB%84%90%EC%97%90%20%EC%B6%9C%EB%A0%A5%EB%90%A9%EB%8B%88%EA%B9%8C%3F.png)
나는 이 문제를 명확히 해 달라는 요청을 받았습니다. 특정 프로그램의 동작에 대해 묻는 것이 아니라, 내가 묻는 동작의 예로 ffmpeg를 사용하고 있습니다. 질문을 다시 말하면:
stdout
프로그램이 다른 프로그램으로 파이프 될 때 터미널 출력을 생성하는 방법. stderr
출력 스트림에 관한 한 이것이 유일한 옵션입니까?
원래 질문:
저는 다양한 전자제품과 프로그래밍 취미를 지원하기 위해 천천히 리눅스를 배우고 있는 Windows 개발자입니다. 저는 헤드리스 Raspberry Pi를 사용하고 있으므로 SSH 터미널을 통해서만 상호 작용합니다. 사실 터미널 출력은 stdout
클래스를 통해 .NET Core 프로그램에서 시작된 하위 프로세스를 제어할 때 Process
터미널 출력은 내 프로그램이 스트림을 가로챌 때 받는 것입니다 stdout
.
하지만 ffmpeg를 VLC로 파이프할 수 있도록 bash를 시작해야 하며 터미널에서 이 작업을 "수동으로" 수행할 때 ffmpeg가 데이터를 VLC로 파이프하는 동안 처리 세부 정보를 터미널에 기록한다는 것을 깨달았습니다. 나는 명령줄 파이프가 stdout
다른 프로그램으로 리디렉션될 것이라고 생각했습니다 stdin
.
stdin
bash에 문제가 있습니다( 내 프로그램에서 switch 로 시작된 프로그램으로 데이터를 전달하지 않는 것 같습니다 ). 따라서 두 개의 인스턴스를 사용하고 그런 식으로 파이프를 처리 bash -c "ffmpeg ... | cvlc ..."
하려고 합니다 .Process
그러다 문득 터미널 출력과 파이프 출력의 관계, 그 뒤에서 무슨 일이 벌어지고 있는지 궁금해졌다.
편집: 이 글을 쓸 때 나는 보통 두 가지를 모두 캡처하고 출력하며 해당 클래스를 사용한다는 사실을 잊어 stdout
버렸 stderr
습니다 Process
. stderr
내 경험상 거의 사용되지 않는 Windows에서는 stderr
오류가 없는 터미널 출력을 위한 Unix의 루틴이 될 수 있습니까? 추측만 해보면...
답변1
프로그램에는 표준 출력과 별도로 출력을 보내는 두 가지 방법이 있습니다.
하나는 표준 오류로 출력하는 것인데, 이는 아마도 Windows보다 Unix 스타일 환경에서 더 일반적일 것입니다.진행 보고서/로그 정보가 stderr 또는 stdout에 속합니까?이에 대해 토론해 보세요. 표준 오류는 리디렉션될 수 있습니다.쉘의 제어 및 리디렉션 연산자는 무엇입니까?
다른 하나는 를 사용하여 프로그램이 실행 중인 터미널(있는 경우)에 직접 출력하는 것입니다 /dev/tty
.사용자 명령을 읽을 수 있으면서도 표준 입력에서 데이터를 "덜" 얻을 수 있는 방법은 무엇입니까?이에 대해 토론하십시오(입력과 관련하여, 유사한 측면이 출력에도 적용됩니다).
답변2
stderr 및 stdout은 터미널에 텍스트를 출력하는 기본 방법입니다.
출력을 stderr 및 stdout으로 리디렉션하는 echo 및 함수를 사용하십시오.
function multioutput(){
>&2 echo 'stderr output'
echo 'stdout output'
}
ffmpeg stderr를 stdout으로 리디렉션하여 둘 다 vlc stdin으로 파이프되도록 하려면:
2>&1 ffmpeg -arg1 -arg2|vlc
vlc가 다른 명령의 텍스트 출력을 처리하는 방법은 나에게 달려 있습니다 ...
당신의 목표를 설명한다면, 당신을 도와줄 행운이 있을지도 모릅니다...