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

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

나는 bash를 처음 접했고 stderr 이전에 일반 stdout을 가정하고 인쇄하는 특정 명령을 실행하는 방법을 평생 알아낼 수 없습니다. ./fff(나 자신의 의미가 혼란 스럽습니다.)

예를 들어

$ 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

답변1

당신은해야합니다잡다어쨌든 stderr 출력은 마지막에 이를 표시합니다.

문서나는 생각했다:

fff 2> file; cat file >&2

또는메모리( 여기서는 spongefrom 이 사용됨 moreutils):

{ fff 2>&1 >&3 3>&- | sponge >&2 3>&-; } 3>&1
  • {...} 3>&1: {...}파일 설명자(fd) 내에서 3개 지점을 가리킵니다.원래stdout (그래서 우리는 이를 사용하여 stdout을 복원할 수 있습니다 fff).
  • fff <redirs> | sponge <redirs>, fff동시에 sponge( <redirs>독립형 애플리케이션) fffstdout은 파이프로 들어가고 spongestdin은 파이프의 다른 쪽 끝입니다.
  • 2>&1fd 2 of : (stderr)는 fff이 시점에서 1:의 파이프와 동일한 것을 가리키므로 fff오류는 sponge해당 파이프를 통해 전달됩니다.
  • >&3: 이제 stdout이 원래 stdout을 가리킵니다(원래 위치로 다시 리디렉션됨).
  • 3>&-fff: 불필요한 fd 3을 닫습니다.
  • sponge>&2입력을 축적하고 stdin에서 eof가 감지된 후에만 표시합니다(종료되고 fff모든 출력이 stderr과 동일한 리소스로 리디렉션된 stdout에 기록되었다고 가정).

설치되어 있지 않은 경우 sponge하나로 교체할 수 있습니다 perl -0777 -pe ''. 를 사용하면 -pe ''입력 perl에서 한 번에 하나의 레코드를 읽고 이를 표준 출력에 씁니다. -0777후루룩 모드입니다. 여기서(이 경우에는 하나만 있음) 레코드는 전체 입력입니다.

관련 정보