나는 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
또는메모리( 여기서는 sponge
from 이 사용됨 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>
독립형 애플리케이션)fff
stdout은 파이프로 들어가고sponge
stdin은 파이프의 다른 쪽 끝입니다.2>&1
fd 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
후루룩 모드입니다. 여기서(이 경우에는 하나만 있음) 레코드는 전체 입력입니다.