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


9

내 질문은 리디렉션 우선 순위가 bash입니다. 다음과 같은 명령이 있다고 가정하십시오.

cmd1 < cmd2 > cmd3

다음과 같이 번역됩니까?

(cmd1 < cmd2) > cmd3

또는

cmd1 < (cmd2 > cmd3)

답변:


11

POSIX 표준 지정 쉘 리디렉션에서 왼쪽에서 오른쪽으로된다; 즉, 순서가 중요합니다.

이 구문 2>&1은 표준 오류를 표준 출력과 동일한 파일로 리디렉션하는 데 종종 사용됩니다. 리디렉션은 처음부터 끝까지 이루어 지므로 리디렉션 순서가 중요합니다. 예를 들면 다음과 같습니다.

ls > foo 2>&1

표준 출력과 표준 오류를 모두 file로 지정합니다 foo. 하나:

ls 2>&1 > foo

표준 출력이 파일로 전송 foo되기 전에 표준 오류가 표준 출력으로 복제 되었기 때문에 표준 출력 만 파일로 보냅니다 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합니다.


Bash 쉘이 POSIX 호환이라고 가정합니다.
fpmurphy

1
나는 그것을 얻지 못한다. 순서가 왼쪽에서 오른쪽이라고 ls > foo 2>&1말 했으므로 stdout을 foo로 리디렉션 한 다음 stderr을 stdout으로 리디렉션 해서는 안됩니다 . 그래서 이것은 작동하지 않아야합니다. 마찬가지로 두 번째 명령이 작동합니다. 내가 여기서 무엇을 놓치고 있습니까?
Deepak Mittal

1
@fpmurphy bash은 기본 동작이 다른 여기설명 된 상황을 제외하고 일반적으로 POSIX를 준수 bash합니다. bash보다 적합 하게하려면 --posix옵션을 사용할 수 있습니다 .
Matt Eckert 2016 년

@dpacmittal 첫 번째 예 ls > foo 2>&1는 다음과 같이 작동합니다. 먼저 표준 출력이로 리디렉션 된 foo다음 표준 오류가 표준 출력 (이제 파일)으로 리디렉션됩니다 foo. 두 번째 예 ls 2>&1 > foo는 다음과 같이 작동합니다. 표준 오류가 표준 출력으로 리디렉션되기 전에 표준 오류가 표준 출력으로 리디렉션 foo되므로 표준 오류가 파일로 전달되는 대신 로컬로 에코됩니다.
Matt Eckert 2016 년

4
@dpacmittal .. ls 2>&1 >foo 아마도 당신은 이것처럼 생각할 수 있습니다. 'ls'의 stderr이 stdout으로 리디렉션됩니다. 이런 일이 일어날 것입니다! stdout 과 관련된 추가 지시문에 관계없이 stdout이 현재 이동하도록 지정된 위치로 이동합니다. (이것은 주요 / 첫 번째 지시문 이므로) 그리고 그것은 ... 기억하십시오 : stderr은 실제로 stdout이되는 것으로 변환되지 않습니다 . 지시문 당시 stdout 지정된 위치로 이동합니다 . (예 : 터미널)
Peter.O

4

둘 다 추측합니다. 괄호 쌍은 하위 셸을 의미합니다. 그러나이 경우 리디렉션으로 인해 하위 셸이 시작되지 않습니다. Bash는 단순히 cmd2stdin으로 피드하고 stdout을로 피드 cmd3합니다.

나는 생각하고, 당신은 같은 것을 의미 cmd1 | cmd2 | cmd3합니까? 귀하의 cmd2cmd3일반적으로 "cmds"대신 일반 파일 이기 때문 입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.