그룹화 명령을 사용하여 stdout 및 stderr을 교체하지 않고 파일로 올바르게 리디렉션할 수 없는 이유는 무엇입니까?

그룹화 명령을 사용하여 stdout 및 stderr을 교체하지 않고 파일로 올바르게 리디렉션할 수 없는 이유는 무엇입니까?

bash 대화형 셸에서 stdout과 stderr을 교환하고 각 스트림을 파일로 리디렉션해 보았습니다.

대괄호를 사용하여 명령을 그룹화하면 원하는 결과를 얻을 수 있습니다. 그런데 그룹 명령을 사용하지 않으면 결과가 왜 바뀌지 않는지 이해할 수 없습니다.

$ # Using Grouping command. Swap operation is succeed.
$ { { echo stdout; echo stderr 1>&2; } 3>&1 1>&2 2>&3; } 1>1.txt 2>2.txt;
$ cat 1.txt
stderr
$ cat 2.txt
stdout

$ # Not using Grouping command. Swap is failed...
$ { echo stdout; echo stderr 1>&2; } 3>&1 1>&2 2>&3 1>1.txt 2>2.txt;
$ cat 1.txt
stdout
$ cat 2.txt
stderr

위 명령의 스왑 파일 설명자 작업에 대한 나의 이해는 다음과 같습니다.

  1. 3>&1: FD3을 FD1로 리디렉션(표준 출력)
  2. 1>&2: FD1을 FD2로 리디렉션(stderr)
  3. 2>&3: FD2를 FD3으로 리디렉션(표준 출력)
  4. 1>1.txt:FD1을 1.txt로 리디렉션합니다(FD1이 stderr을 가리킴).
  5. 2>2.txt:FD2를 2.txt로 리디렉션합니다(FD2는 stdout을 가리킴).

하지만 제가 이해한 바에 따르면 교정장치 유무에 따라 결과가 바뀌면 안 된다고 생각합니다.

제가 기본적인 오해를 하고 있는 걸까요? 위 두 명령의 결과가 다른 이유는 무엇입니까?

내 환경에 대한 정보입니다.

$ bash --version
GNU bash, version 4.4.12(1)-release (x86_64-apple-darwin16.3.0)
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

답변1

Bash는 파일 설명자를 오른쪽에서 왼쪽으로 역순으로 처리합니다. 먼저 2>2.txt, 그 다음 1>1.txt등등...

관련 정보