Мне знаком этот синтаксис:
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
. «Странный синтаксис» кажется лучшим способом.Ответы:
Да, стандарт POSIX позволяет это. По версии 2008 года:
И включает этот пример нескольких «здесь-документов» в одну строку:
Таким образом, нет проблем с перенаправлениями или каналами. Ваш пример похож на что-то вроде этого:
Грамматика оболочки (далее на связанной странице) включает следующие определения:
Таким образом, за символом вертикальной черты может следовать конец строки, и он все равно будет считаться частью конвейера.
источник
Да, это в грамматике оболочки POSIX. У вас также может быть более одного документа для одной команды (в некоторых других примерах используется два
cat
вызова, но это тоже работает):Это надумано (с использованием двух документов здесь для стандартного ввода), но если вы думаете о вводе данных для разных файловых дескрипторов, это сразу имеет смысл.
Также есть возможность полностью отказаться от
cat
. Почему бы не сделать этот документ напрямую доступным дляcmd
:источник
sudo tee /etc/securefile.conf <<EOF
.Хм, полагаю, что да, согласно тесту в bash в режиме POSIX:
источник
EOF
. Подсказка будет вести себя странно, и вы удивитесь, что, черт возьми, не такПривет, проверьте это, например
С уважением
источник