Bash에서 stdin 및 stdout 리디렉션의 우선순위

Bash에서 stdin 및 stdout 리디렉션의 우선순위

내 질문은 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을 cmd2stdin으로, stdout을 cmd3.

궁금해요. 이게 무슨 뜻인가요 cmd1 | cmd2 | cmd3? 귀하의 cmd2cmd3일반적으로 "cmds"가 아닌 일반 파일이기 때문입니다.

관련 정보