Bash에서 '2>> (command)'리디렉션의 의미


18

얼마 전에 스크립트를 작성하고 그 주위에 로깅을 추가했지만 로깅 리디렉션이 작동하는 방식을 잊었습니다.

그것의 요지는 :

#!/bin/bash

LOGFILE=/some/path/mylogfile

(
  # here go my commands which produce some stdout
  # and, if something goes wrong, also some stderr
) 1>>${LOGFILE} 2> >( tee -a ${LOGFILE} >&2 )

스크립트를 실행하면에 아무것도 인쇄되지 않고에 인쇄되는 stdout내용 만 인쇄됩니다 stderr. 로그 파일 ${LOGFILE}은 stdout과 stderr을 모두 캡처합니다.

스크립트를 실행하고 터미널에 출력이 없으면 모든 것이 정상임을 알 수 있습니다. 출력이 있으면 문제가 있음을 알고 로그 파일을 확인하여 문제가 무엇인지 알 수 있습니다.

지금 당황하는 방향 전환의 일부는 다음과 같은 구문입니다. 2> >( some command )

아무도 거기에서 무슨 일이 일어나고 있는지 설명 할 수 있습니까?

답변:


23

>(...)프로세스 대체 라고 합니다 . "외부"프로그램이 마치 파일 인 것처럼 "내부"프로그램에 쓸 수 있습니다.

이 경우에는 쓰고 stderrtee -a ${LOGFILE} >&2에 추가되는 LOGFILE과에 다음도 쓰기 모든 것을 다시 stderr.

경로 재 지정 연산자는 프로세스 대체를 위해 어느 방향 으로든 이동할 수 있으므로이 예제와 같이 쓰거나 <(...)읽을 수 있습니다. 예를 들어 while서브 쉘에서 루프를 실행하지 않고 루프를 수행하는 편리한 방법 입니다. 그 자체.


5
:-) 내가 실행 echo <(date)하면 대체 파일의 이름을 알려줍니다 /dev/fd/63. 내가 실행 cat <(date)하면 날짜, 즉 대체 된 파일의 내용을 알려줍니다 Fri Nov 18 14:11:09 NZDT 2016.
NZD

@ NZD, 그렇습니다.하지만 일반 파일이라고는 생각하지 않습니다 /dev. 프로세스 사이의 파이프 이름입니다.
Toby Speight

stderr를 파이프 할 수 없기 때문에이 기술을 사용 tee합니까?
bli

@bli 예, stdout이 이미 다른 곳으로 리디렉션되어 있기 때문에 teestderr에 대한 가장 간단한 방법 인 stdout과 분리 된 것처럼 보입니다 .
Eric Renouf
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.