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
위 명령의 스왑 파일 설명자 작업에 대한 나의 이해는 다음과 같습니다.
3>&1
: FD3을 FD1로 리디렉션(표준 출력)1>&2
: FD1을 FD2로 리디렉션(stderr)2>&3
: FD2를 FD3으로 리디렉션(표준 출력)1>1.txt
:FD1을 1.txt로 리디렉션합니다(FD1이 stderr을 가리킴).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
등등...