Bash 복합 리디렉션(이 명령의 기능은 무엇입니까)?

Bash 복합 리디렉션(이 명령의 기능은 무엇입니까)?

나는 최근에 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

단계별로 설명하면 다음과 같습니다.

  1. 2>&1그래서 우리는 끝에 왔습니다 . 이것은 의미합니다 copy stdout to stderr. 이것은 나중에 중요할 것입니다.
  2. exec > >. 무엇? 나는 >file예 별칭을 알고 있습니다 1>file. 그럼 기본적으로 그게 다야 exec 1>1>(tee ...| logger ...)? 그래서 왜 안돼 exec>(tee ...|logger...)?

  3. 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와 함께 사용할 수 없다는 것을 알고 있습니다.

  4. Tee는 표준 출력을 가져와서 로거의 표준 입력으로 인쇄합니다. 그런 다음 로거 설명자 "2"(stdin 및 stderr 포함)를 /dev/console에 추가합니다. 그런데 왜 파이프인가? 로거는 이미 설명자 번호 2의 stdout에 액세스할 수 있습니다.

관련 정보