[bash] heredoc을 파이핑하기위한 여러 줄 구문; 이거 휴대용인가요?

이 구문에 익숙합니다.

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


답변

흠, POSIX 모드의 bash 테스트에 따르면 예라고 가정합니다.

$ bash --posix
$ cat <<EOF |
> ahoj
> nazdar
> EOF
> sed 's/a/b/'
bhoj
nbzdar


답변

안녕하세요, 예를 들어 확인하십시오

#!/bin/sh
( base32 -d | base64 -d )<<ENDOFTEXT
KNDWW42DNNSHS5ZXPJCG4MSVM5MVQVT2JFCTK3DELBFDCY2IIJYGE2JUJNHWS22LINVHQMCMNVFD
CWJQIIZVUV2JOVNEOVJLINTW6PIK
ENDOFTEXT

문안 인사


답변