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


132

이 구문에 익숙합니다.

cmd1 << EOF | cmd2
text
EOF

그러나 bash가 내가 쓸 수 있음을 발견했습니다.

cmd1 << EOF |
text
EOF
cmd2

heredoc은 cmd1의 입력으로 사용되며 cmd1의 출력은 cmd2로 파이프됩니다. 이것은 매우 이상한 구문처럼 보입니다. 휴대용인가요?


나는 이것을 여러 줄로 나누는 좋은 방법을 찾기 위해 여기에 왔습니다 big-long-command1 with lots of args << EOF | big-long-command2 with lots of args. "홀수 구문"은 가장 좋은 방법 인 것 같습니다.
PaulC

이를위한 편리한 사용 사례는 공백으로 구분 된 표를 탭으로 구분 된 표로 변환하여 Google 스프레드 시트에 붙여 넣을 수있는 경우입니다. 임시 파일을 만들 필요가 없습니다.
Sridhar Sarnobat

첫 번째는 z-shell에서 작동하지 않았습니다. 나는 두 번째 것을 싫어하기 때문에 | 명령에서 쉘 파이프 라인의 관용구 (?)를 잃습니다.
Sridhar Sarnobat

답변:


104

예, 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 */

따라서 파이프 기호 뒤에 줄 끝이 올 수 있으며 여전히 파이프 라인의 일부로 간주됩니다.


26

예, 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

```cat << EOF1 << EOF2 첫 번째 here-doc EOF1 두 번째 here-doc EOF2```위의 작동하지 않습니다.
user1424739

@ user1424739 현재 zsh 및 bash에서 작동합니다. 재와 ksh93은 두 번째 문서 만 출력하는 것 같습니다.
Jens

왜 공감해야합니까? 부정확 한 것이 있으면 치료할 기회를주십시오.
Jens

이것은 사용할 때 꽤 달콤 sudo tee /etc/securefile.conf <<EOF합니다.
dragon788

어떤 bash 버전에서 작동합니까? bash 4.4.19 (우분투 18.04.02)와 bash 5.0 (docker image)을 사용하여 두 번째 here-doc 만 얻었습니다. 아니면 특정 옵션이 있습니까?
huelbois

17

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

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

단 하나의 작은 메모 : 닫은 후에 공백을 두지 마십시오 EOF. 프롬프트가 이상하게 작동하고 도대체 무엇이 잘못되었는지 궁금해 할 것입니다
Sridhar Sarnobat

2
POSIX 모드에서 bash를 실행하면 일부 확장 기능 이 차단 되지만 거의 모든 확장 기능 이 차단 되지는 않습니다. 따라서 POSIX가 허용하는 측면에서이 답변은 정확하지만 그 추론은이를 효과적으로 지원하지 않습니다.
찰스 더피

3

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

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

문안 인사

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