STDERR 전에 STDOUT을 표시 하시겠습니까?


9

나는 bash를 처음 ./fff접 했고 내 인생에서 특정 명령을 실행하고 stderr 전에 정기적 인 stdout을 가정 하고 인쇄 하는 방법을 알아낼 수 없다 (나는 의미에 대해 혼란스러워한다)

예를 들어

$ printf "I am a\ndrill\n" > fff; 
$ cat fff nofile fff nofile fff

I am a
drill
cat: nofile: No such file or directory
I am a
drill
cat: nofile: No such file or directory
I am a
drill

다음과 같이 인쇄해야합니다.

I am a
drill
I am a
drill
I am a
drill
cat: nofile: No such file or directory
cat: nofile: No such file or directory

출력을 파일로 먼저 리디렉션 한 다음 동일한 파일에 오류를 추가해야하지만 이것이 내가 얻는 출력임을 이해합니다.

$ cat ./foo nofile ./foo nofile ./foo <<< $(touch fin) > see 2>> see 

I am a
drill
I am a
drill
I am a
drill
ectory
cat: nofile: No such file or directory

2
cat"a"를 "some"으로 대체 했습니까 ?
Dmitry Grigoryev

오 댕 내가 문자열을 엉망으로 만들었을 수도 있습니다. @DmitryGrigoryev
MeOw

답변:


18

당신은해야 누르고 마지막에 표시 할 수 있도록 어쨌든 표준 에러 출력 곳입니다.

파일은 마음에 온다 :

fff 2> file; cat file >&2

또는 메모리 (여기 sponge에서 from 사용 moreutils) :

{ fff 2>&1 >&3 3>&- | sponge >&2 3>&-; } 3>&1
  • {...} 3>&1: {...}파일 디스크립터 (fd) 내에서 3은 원래 stdout 과 동일한 리소스를 가리 킵니다 (따라서 stdout을 복원하는 데 사용할 수 있음 fff).
  • fff <redirs> | sponge <redirs>, fffsponge(시작과 동시에 <redirs>독립적인가)과 fff의 표준 출력 파이프로 이동하고, sponge의 표준 입력 파이프의 타단 인.
  • 2>&1: fff(stderr) 의 fd 2는 1 : 파이프와 같은 점을 가리키고 있습니다. 따라서 fff오류는 sponge해당 파이프 를 통과합니다.
  • >&3: 이제 stdout은 원래 stdout을 가리 킵니다 (이전 상태로 다시 리디렉션).
  • 3>&-: 우리 fff는 필요하지 않은 fd 2를 닫습니다.
  • sponge입력을 누적하고 >&2stdin에서 eof를 감지 한 후 (stderout과 동일한 리소스로 리디렉션 된 stdout에) 표시합니다 ( fff종료시 이미 stdout에 모든 출력을 쓴 것으로 가정 ).

sponge이 설치되어 있지 않으면 로 교체 할 수 있습니다 perl -0777 -pe ''. 로 -pe '', perl입력에서 한 번에 하나 개의 레코드를 읽고 표준 출력에 기록합니다. -0777(이 경우 하나만) 레코드가 전체 입력 인 slurp 모드입니다.


시간이 있으면 친절하게 분해하십시오!
George Udosen

... tee대신에 사용할 수 있습니까 sponge?
George Vasiliou

@GeorgeUdosen 편집을 참조하십시오.
Stéphane Chazelas

1
@GeorgeVasiliou tee는 데이터를 보유하지 않으며 데이터를 읽는 즉시 기록합니다.
Stéphane Chazelas

2
@MeOw : 괜찮습니다. 그러나 Stéphane의 답변의 세 번째 줄에서 알 수 있듯이 stdout을 저장할 필요는 없습니다. 그냥하세요 cat foo nofile foo nofile foo 2> ferr.txt; cat ferr.txt. (그리고 당신은 아마 t 사용할 돈 >>.) 또한, 스테판은 당신이 아마해야한다고 우수한 점하게 cat ferr.txt >&2표준 에러 정보 작성 표준 오류.
G-Man, 'Reinstate
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.