나는 최근에 AWS 가상 머신 설정 스크립트를 망쳤습니다. 문서에는 다음 줄을 포함하라고 나와 있습니다.
exec > >(tee /var/log/user-data.log|logger -t user-data -s 2>/dev/console) 2>&1
yum -y update
echo "Hello from user-data!"
나중에 AWS 웹 사이트에서 가상 머신 로그에 액세스할 수 있습니다.
하지만 여기서는 AWS가 중요하지 않습니다. 첫 번째 명령의 기능이 정확히 무엇인지 궁금합니다. >
or 와 같은 기본 bash 리디렉션을 알고 있지만 중첩된 리디렉션( , ) 2>&1
이 너무 많다는 사실 이 정신을 잃게 만듭니다.exec > >
-s 2>dev/console
단계별로 설명하면 다음과 같습니다.
2>&1
그래서 우리는 끝에 왔습니다 . 이것은 의미합니다copy stdout to stderr
. 이것은 나중에 중요할 것입니다.exec > >
. 무엇? 나는>file
예 별칭을 알고 있습니다1>file
. 그럼 기본적으로 그게 다야exec 1>1>(tee ...| logger ...)
? 그래서 왜 안돼exec>(tee ...|logger...)
?exec > >(tee /var/log-user-data.log|logger -t user-data -s 2>/dev/console)
대괄호는(tee ...|logger ...)
exec에서 stdout을 받아 파일에 넣습니다. 문제는 tee가 stdin에서 읽어서 파일로 출력해야 한다는 것입니다. 하지만 여기서는 표준 출력으로 전달합니다. 기본적으로 그게 다야1|tee file
? 파이프는 그러한 설명자 ID와 함께 사용할 수 없다는 것을 알고 있습니다.Tee는 표준 출력을 가져와서 로거의 표준 입력으로 인쇄합니다. 그런 다음 로거 설명자 "2"(stdin 및 stderr 포함)를 /dev/console에 추가합니다. 그런데 왜 파이프인가? 로거는 이미 설명자 번호 2의 stdout에 액세스할 수 있습니다.