나는 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>
,fff
및sponge
(시작과 동시에<redirs>
독립적인가)과fff
의 표준 출력 파이프로 이동하고,sponge
의 표준 입력 파이프의 타단 인.2>&1
:fff
(stderr) 의 fd 2는 1 : 파이프와 같은 점을 가리키고 있습니다. 따라서fff
오류는sponge
해당 파이프 를 통과합니다.>&3
: 이제 stdout은 원래 stdout을 가리 킵니다 (이전 상태로 다시 리디렉션).3>&-
: 우리fff
는 필요하지 않은 fd 2를 닫습니다.sponge
입력을 누적하고>&2
stdin에서 eof를 감지 한 후 (stderout과 동일한 리소스로 리디렉션 된 stdout에) 표시합니다 (fff
종료시 이미 stdout에 모든 출력을 쓴 것으로 가정 ).
sponge
이 설치되어 있지 않으면 로 교체 할 수 있습니다 perl -0777 -pe ''
. 로 -pe ''
, perl
입력에서 한 번에 하나 개의 레코드를 읽고 표준 출력에 기록합니다. -0777
(이 경우 하나만) 레코드가 전체 입력 인 slurp 모드입니다.