태그 보관물: stdout

stdout

STDERR 전에 STDOUT을 표시 하시겠습니까? 수 없다 (나는

나는 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


답변

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

파일은 마음에 온다 :

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 모드입니다.


답변