Многострочный синтаксис для передачи heredoc;это портативный? - PullRequest
115 голосов
/ 13 августа 2011

Я знаком с этим синтаксисом:

cmd1 << EOF | cmd2
text
EOF

но только что обнаружил, что bash позволяет мне написать:

cmd1 << EOF |
text
EOF
cmd2

(heredoc используется в качестве входных данных для cmd1, а выходные данные cmd1 передаются в cmd2). Это выглядит как очень странный синтаксис. Это портативный?

Ответы [ 4 ]

88 голосов
/ 13 августа 2011

Да, стандарт POSIX позволяет это. Согласно версии 2008 года:

Настоящий документ должен рассматриваться как одно слово, которое начинается после следующего <newline> и продолжается до тех пор, пока не появится строка, содержащая толькоразделитель и <newline>, без <blank> символов между ними.Затем начинается следующий документ здесь, если он есть.

И включает в себя этот пример нескольких «документов здесь» в одной строке:

cat <<eof1; cat <<eof2
Hi,
eof1
Helene.
eof2

Итак, естьнет проблем с перенаправлениями или трубами.Ваш пример похож на этот:до конца строки и все еще считаться частью конвейера.

20 голосов
/ 21 мая 2012

Да, это в грамматике оболочки POSIX.Вы также можете иметь более одного документа здесь для одной и той же команды (в некоторых других примерах используются два вызова cat, но это также работает):

cat <<EOF1 <<EOF2
first here-doc
EOF1
second here-doc
EOF2

Это надумано(используя 2 вот-документа для стандартного ввода), но если вы подумаете о предоставлении ввода для различных файловых дескрипторов, это сразу же имеет смысл.

Также есть возможность полностью удалить cat .Почему бы не сделать этот документ доступным непосредственно для cmd:

cmd << EOF
input
here
EOF
13 голосов
/ 13 августа 2011

Хм, полагаю да, согласно тесту в bash в режиме POSIX:

$ bash --posix
$ cat <<EOF |
> ahoj
> nazdar
> EOF
> sed 's/a/b/'
bhoj
nbzdar
1 голос
/ 21 марта 2019

Привет, проверьте это, например

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

С уважением

...