내 질문은 bash의 리디렉션 우선 순위에 관한 것입니다. 다음과 같은 명령이 있다고 가정해 보겠습니다.
cmd1 < cmd2 > cmd3
다음과 같이 번역될 수 있습니다:
(cmd1 < cmd2) > cmd3
또는
cmd1 < (cmd2 > cmd3)
답변1
이것POSIX 표준 조항쉘 리디렉션은 왼쪽에서 오른쪽으로 이루어집니다. 즉, 순서가 중요합니다.
이 구성은
2>&1
일반적으로 표준 오류를 표준 출력과 동일한 파일로 리디렉션하는 데 사용됩니다. 리디렉션은 처음부터 끝까지 발생하므로 리디렉션 순서가 중요합니다. 예를 들어:ls > foo 2>&1
표준 출력 및 표준 오류를 파일로 직접 보냅니다
foo
. 하지만:ls 2>&1 > foo
foo
표준 출력 이 file 로 지정되기 전에 표준 오류가 표준 출력으로 복사되기 때문에 표준 출력만 file 로 지정됩니다foo
.
bash
이 섹션의 표준을 따르십시오.
$ ls doesnotexist > foo 2>&1
$ cat foo
ls: cannot access doesnotexist: No such file or directory
$ ls doesnotexist 2>&1 > foo
ls: cannot access doesnotexist: No such file or directory
$ cat foo
$
파이프라인의 경우:
표준 입력이나 표준 출력 또는 둘 다의 파이프 할당이 리디렉션 전에 발생하므로 리디렉션을 통해 수정할 수 있습니다. 예를 들어:
$ command1 2>&1 | command2
표준 출력 및 표준 오류를
command1
표준 입력으로 보냅니다command2
.
답변2
나는 그렇게 생각하지 않습니다. 한 쌍의 괄호는 서브쉘을 나타냅니다. 그러나 이 경우 리디렉션으로 인해 하위 쉘이 시작되지 않습니다. Bash는 stdin을 cmd2
stdin으로, stdout을 cmd3
.
궁금해요. 이게 무슨 뜻인가요 cmd1 | cmd2 | cmd3
? 귀하의 cmd2
및 cmd3
일반적으로 "cmds"가 아닌 일반 파일이기 때문입니다.