stdout to stderr?


17

한 프로세스에서 다른 프로세스의 stdin으로 콘솔뿐만 아니라 stdout을 보내려고합니다. 예를 들어 stdout을 stdout + stderr로 전송합니다.

예를 들어 git edit다음과 같은 별칭이 있습니다.

git status --short | cut -b4- | xargs gvim --remote

파일 이름 목록을 화면뿐만 아니라에 보내려고합니다 xargs.

그래서 tee이것을 할 비슷한 유틸리티가 있습니까? 그래서 나는 다음과 같은 것을 할 수 있습니다 :

git status --short | \
    cut -b4- | almost-but-not-quite-entirely-unlike-tee | \
    xargs gvim --remote

답변:


14

tee 를 사용하여 현재 콘솔에 복제 할 수 있습니다 tee /dev/tty

git status --short | cut -b4- | tee /dev/tty | xargs gvim --remote

/dev/stdout또는 /dev/stderr명령을 스크립트 내에있는 경우 또는를 사용할 수 있지만 리디렉션 될 수 있습니다. 참고 /dev/tty항상 콘솔 될 것입니다 (그리고 비 대화식 쉘에 존재하지 않을 수 있습니다). 이것은 틀렸다, 의견을 읽으십시오.


1
실제로, 파이프 라인에서 당신이 보여 /dev/stdout 됩니다 리디렉션. 즉, tee /dev/stdout효과 를 사용 하는 경우 모든 것이 xargs두 번 전송되고 터미널에는 아무것도 보내지 않습니다.
celtschk

/dev/stdout파이프로 리디렉션되지 않으면 현재 프로세스 표준 출력을 유지합니다. 그러나 스크립트에서 명령을 캡슐화 한 후이 스크립트의 stdout을 경로 재 지정하면 경로 /dev/stdout재 지정됩니다. 대화 형 콘솔에서 tee /dev/ttytee /dev/stdout파이프를 사용하는 경우에도 같은 효과가 있습니다.
Vincent Robert

당신이 저를 믿지 않는 경우, 쉘 입력 시작 echo foo | tee /dev/stdout | tr f becho foo | tee /dev/tty | tr f b. 힌트는 다음과 같습니다 . 파일 이름으로 tee해석합니다 /dev/stdout.
celtschk

2
네 말이 맞아 내가 어떻게 그리웠는지 모르겠어 나는 tty와 stdout으로 내 자신의 쉘에서 몇 가지 테스트를 수행했으며 어떻게 든 그것을 놓쳤다. 설명 주셔서 감사합니다, 나는 잘못된 진술을 제거했습니다.
Vincent Robert

stderr가 파이프의 영향을받지 않는다는 것을 감안할 때 제거해야 할 필요는 없습니다 (물론 스크립트 리디렉션주의 사항은 남아 있지만 스크립트의 경우 리디렉션 가능성은 일반적으로 원하는 속성입니다).
celtschk


3

tee 명령을 사용할 수 있습니다 . 예를 들어 STDERR 파일과 함께 제공하면됩니다.

tee /dev/stderr
tee /proc/self/fd/2

이 경우 귀하의 별칭은 다음과 같습니다.

git status --short | \
    cut -b4- | tee /dev/stderr | \
    xargs gvim --remote

1
제 생각에는/proc/self/fd/2
celtschk
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.