모호한 bash 스트림 리디렉션

모호한 bash 스트림 리디렉션

Bash 리디렉션을 이해하려고 합니다(3.6.리디렉션). 테스트 환경을 준비하고 리디렉션 작업 순서와 파일 디스크립터 생성 순서를 이해하려고 노력했습니다.

테스트 환경 준비:

cd `mktemp -d`
mkdir no_access_dir
chmod 000 no_access_dir

ls -R출력은 다음과 같습니다.

.:
no_access_dir
ls: cannot open directory './no_access_dir': Permission denied

처음 2개의 stdout 라인과 1개의 stderr 출력이 이어집니다.

3.6.2 Redirecting Output다음을 사용하여 3.6.4 Redirecting Standard Output and Standard Error명령의 동작을 확인했습니다 .3.6.8 Duplicating File Desciptors3.6.9 Moving File Desciptors

테스트 명령은 다음과 같습니다.

ls -R 2>&1 > a    # 1. 3.6.2 or 3.6.8
ls -R 2>&1- > a   # 2. 3.6.9
ls -R 1>&2 > a    # 3. 3.6.2 or 3.6.8
ls -R 1>&2- > a   # 4. 3.6.9
ls -R > a 2>&1    # 5. 3.6.4
ls -R > a 1>&2    # 6. 3.6.4

출력 설명:

  1. ls -R 2>&1 > a- 파일 a에 자체 내용이 포함되어 있고 오류 메시지가 없습니다. 이유는 무엇입니까?
  2. ls -R 2>&1- > a- 위와 달라진 점은 없습니다. - 그렇다면 모바일FD의 의미는 무엇인가요?
  3. ls -R 1>&2 > a- 그래도 변한 건 없어
  4. ls -R 1>&2- > a- 오류 메시지가 표시되지 않으며 오류 메시지가 파일에 표시되지 않습니다.
  5. ls -R > a 2>&1- 두 스트림 모두 파일로 리디렉션됩니다. 예상대로 작동합니다.
  6. ls -R > a 1>&2- stdout이 stdout으로 리디렉션되므로 파일 a가 비어 있습니다.

5나는 및 의 출력을 이해 6하지만 왜 command 에서 1출력 23동일하고 왜 number가 4오류 메시지를 표시하지 않거나 이 메시지를 파일에 저장하지 않는지는 미스터리입니다.

그래서 내 질문은 다음과 같습니다

  1. [n]>word출력 리디렉션과 fd 복사의 차이점은 무엇입니까 [n]>&digit? 어느 것을 사용합니까?2>&1
  2. 1출력 파일에 오류 메시지가 포함되어 있지 않은 경우 이유는 무엇입니까 2? stderr 스트림이 stdout으로 리디렉션되었습니다.
  3. 모바일 FD의 사용 사례는 무엇입니까?
  4. 오류 메시지는 어디에서 발생합니까 4? 출력 파일이나 콘솔에 없습니다.

내 현재 이해는 다음과 같습니다. ls -R > a 2>&1- 먼저 Bash가 파일을 생성한 다음 새로 생성된 파일을 찾는 a명령을 실행 하고 파일로 리디렉션 하고 저장하는 메시지를 표시합니다. 하지만 이 경우 구문은 매우 불분명합니다.ls -Rastderrstdout

답변1

문제는 타이밍입니다. 리디렉션이 발생하면 순차적으로 적용되기 때문에 명령줄에서의 위치가 중요합니다. 따라서 포인트 1-4의 경우 나중에 오는지는 중요하지 않습니다 > a. 최종적으로 도달한 경우에만 적용됩니다. 완료된 모든 작업은 &2이전에 발생했으므로 해당 지점 > a으로 리디렉션하면 &1여전히 이전 작업, 즉 터미널 출력을 참조하게 됩니다.

관련 정보