저는 항상 명령 뒤에 stdin 리디렉션을 작성합니다. 왜냐하면 명령을 먼저 받은 다음 리디렉션(있는 경우)하는 것이 더 자연스럽게 느껴지기 때문입니다.
some-command < input-file > output-file
수년에 걸쳐 나는 사람들이 흐름 방향을 얻기 위해 명령 전에 stdin 리디렉션을 작성하는 것을 보았습니다.
< input-file some-command > output-file (or without spaces after < and > )
이 주문은 POSIX 또는 많은 쉘에서 허용됩니까(내 Fedora 21에서는 bash
, dash
및 에서 허용됨 tcsh
) ?ksh
zsh
답변1
이 동작은 POSIX에 의해 정의됩니다.여기:
명령이 여러 리디렉션 연산자를 지정하는 경우 평가 순서는 처음부터 끝까지입니다.
그리고여기:
"간단한 명령"은 임의의 순서로 선택적인 변수 할당 및 리디렉션의 시퀀스이며 선택적으로 단어와 리디렉션이 뒤따르고 제어 연산자에 의해 종료됩니다.
이미 그런 일이 일어나고 있습니다본 쉘, POSIX는 이를 기반으로 합니다.
셸에서 해석되는 특수 기호를 사용하여 명령을 실행하기 전에 명령의 입력과 출력을 리디렉션할 수 있습니다. 다음은 간단한 명령의 어느 위치에나 나타날 수 있고 명령 앞이나 뒤에 올 수 있지만 호출된 명령으로 전달되지는 않습니다. (…)
원래 Bourne 셸과 달리 POSIX는 등의 복잡한 명령 앞에 리디렉션을 허용하지 않습니다 while … done
.( … )
리디렉션 순서는 명령의 동작을 제어하고 실패 시 이상한 결과를 얻는 것을 방지하기 때문에 중요합니다. 예:
command <input >output
command
읽을 수 없는 경우 input
(권한으로 인해 존재하지 않음...) output
리디렉션 위치가 바뀌면 빈 파일을 만들지 않고 종료됩니다.
command >output <input
답변2
bash
글쎄, 접두사 표기법이 여전히 실패한 것 같으니
$ < /etc/passwd while read line; do echo $line; done
bash: syntax error near unexpected token `do'
while은 zsh
루프 이전에 이러한 리디렉션을 허용합니다 while
.