programing

에레독 배관을 위한 다중 라인 구문; 이것은 휴대 가능합니까?

telebox 2023. 5. 2. 22:35
반응형

에레독 배관을 위한 다중 라인 구문; 이것은 휴대 가능합니까?

다음 구문에 대해 잘 알고 있습니다.

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를 사용하여) 고안되었지만, 다른 파일 설명자에 대한 입력을 제공하는 것을 고려하면 즉시 의미가 있습니다.

전체를 포기할 가능성도 있습니다.여기 문서를 직접 사용할 수 있도록 하는 것은 어떻습니까?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

안부 전해요

언급URL : https://stackoverflow.com/questions/7046381/multiline-syntax-for-piping-a-heredoc-is-this-portable

반응형