이 구문에 익숙합니다.
cmd1 << EOF | cmd2
text
EOF
그러나 bash가 내가 쓸 수 있음을 발견했습니다.
cmd1 << EOF |
text
EOF
cmd2
heredoc은 cmd1의 입력으로 사용되며 cmd1의 출력은 cmd2로 파이프됩니다. 이것은 매우 이상한 구문처럼 보입니다. 휴대용인가요?
이 구문에 익숙합니다.
cmd1 << EOF | cmd2
text
EOF
그러나 bash가 내가 쓸 수 있음을 발견했습니다.
cmd1 << EOF |
text
EOF
cmd2
heredoc은 cmd1의 입력으로 사용되며 cmd1의 출력은 cmd2로 파이프됩니다. 이것은 매우 이상한 구문처럼 보입니다. 휴대용인가요?
답변:
예, POSIX 표준이이를 허용합니다. 2008 버전에 따르면 :
이 문서는 다음 단어 이후에 시작 하여 사이에 문자 가없는
<newline>
구분 기호와 a 만 포함 된 줄이있을 때까지 계속되는 단일 단어로 취급됩니다 . 그런 다음 다음 문서가 있으면 시작합니다.<newline>
<blank>
그리고 같은 줄에 여러 개의 "여기 문서"에 대한이 예제가 포함됩니다.
cat <<eof1; cat <<eof2
Hi,
eof1
Helene.
eof2
따라서 방향 재 지정 또는 파이프를 수행하는 데 문제가 없습니다. 귀하의 예는 다음과 유사합니다.
cat file |
cmd
그리고 쉘 문법 (링크 된 페이지에서 더 아래에 있음)에는 다음 정의가 포함됩니다.
pipe_sequence : command
| pipe_sequence '|' linebreak command
newline_list : NEWLINE
| newline_list NEWLINE
;
linebreak : newline_list
| /* empty */
따라서 파이프 기호 뒤에 줄 끝이 올 수 있으며 여전히 파이프 라인의 일부로 간주됩니다.
예, POSIX 셸 문법에 있습니다. 동일한 명령에 대해 하나 이상의 here-doc을 가질 수도 있습니다 (일부 다른 예제에서는 두 개의 cat
호출을 사용 하지만이 방법도 작동합니다).
cat <<EOF1 <<EOF2
first here-doc
EOF1
second here-doc
EOF2
이것은 stdin에 2 개의 here-docs를 사용하여 고안되었지만 다른 파일 설명자에 대한 입력을 제공하려는 경우 즉시 의미가 있습니다.
할 수있는 가능성도 있습니다 사람 드롭 cat
전체가 . 왜에 여기-문서에서 직접 사용할 수있게 만들 수 없습니다 cmd
:
cmd << EOF
input
here
EOF
sudo tee /etc/securefile.conf <<EOF
합니다.
흠, POSIX 모드의 bash 테스트에 따르면 예라고 가정합니다.
$ bash --posix
$ cat <<EOF |
> ahoj
> nazdar
> EOF
> sed 's/a/b/'
bhoj
nbzdar
EOF
. 프롬프트가 이상하게 작동하고 도대체 무엇이 잘못되었는지 궁금해 할 것입니다
big-long-command1 with lots of args << EOF | big-long-command2 with lots of args
. "홀수 구문"은 가장 좋은 방법 인 것 같습니다.