POSIX 7
kennytm цитирует man bash
, но большая часть этого также POSIX 7: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_07_04:
Операторы перенаправления «‹<» и «‹< -» позволяют перенаправлять строки, содержащиеся во входном файле оболочки, известном как «здесь-документ», на ввод команды.
Здесь-документ должен рассматриваться как отдельное слово, которое начинается после следующего и продолжается до тех пор, пока не появится строка, содержащая только разделитель и a, без символов между ними. Затем начинается следующий здесь-документ, если он есть. Формат следующий:
[n]<<word
here-document
delimiter
где необязательное n представляет собой номер дескриптора файла. Если номер опущен, здесь-документ относится к стандартному вводу (дескриптор файла 0).
Если какой-либо символ в слове заключен в кавычки, разделитель должен быть сформирован путем удаления кавычек в слове, а строки настоящего документа не должны расширяться. В противном случае разделителем будет само слово.
Если символы в слове не цитируются, все строки настоящего документа должны быть расширены для расширения параметров, подстановки команд и арифметического расширения. В этом случае ввод ведет себя как внутренние двойные кавычки (см. Двойные кавычки). Однако символ двойной кавычки ('"') не должен обрабатываться специально в данном документе, за исключением случаев, когда двойная кавычка появляется внутри" $ () "," `` "или" $ {} ".
Если символ перенаправления - «‹< -», все начальные символы <tab>
должны быть удалены из строк ввода и строки, содержащей конечный разделитель. Если в строке указано более одного оператора «‹<» или «‹< -», здесь-документ, связанный с первым оператором, должен быть предоставлен первым приложением и должен быть прочитан оболочкой первым.
Когда здесь-документ читается с терминального устройства и оболочка является интерактивной, она должна записывать содержимое переменной PS2, обработанной, как описано в разделе «Переменные оболочки», в стандартную ошибку перед чтением каждой строки ввода до тех пор, пока не будет распознан разделитель.
Примеры
Некоторые примеры еще не приведены.
Котировки предотвращают расширение параметра
Без кавычек:
a=0
cat <<EOF
$a
EOF
Выход:
0
С цитатами:
a=0
cat <<'EOF'
$a
EOF
или (уродливо, но верно):
a=0
cat <<E"O"F
$a
EOF
Выходы:
$a
Дефис удаляет первые табуляции
Без дефиса:
cat <<EOF
<tab>a
EOF
где <tab>
- буквальная вкладка и может быть вставлена с помощью Ctrl + V <tab>
Выход:
<tab>a
С дефисом:
cat <<-EOF
<tab>a
<tab>EOF
Выход:
a
Это, конечно, существует для того, чтобы вы могли делать отступы в вашем cat
, как в окружающем коде, который легче читать и поддерживать. Например.:
if true; then
cat <<-EOF
a
EOF
fi
К сожалению, это не работает с пробелами: POSIX одобрил здесь tab
отступ. Ой.
person
Ciro Santilli 新疆再教育营六四事件ۍ
schedule
09.06.2015
cat
. Попробуйтеpsql ... << EOF ...
См. Также здесь строки. mywiki.wooledge.org/BashGuide/InputAndOutput?#Here_Strings - person Dennis Williamson   schedule 23.03.2010cat
читает stding (когда он передан по конвейеру) или читает файл, соответствующий его аргументам командной строки - person The-null-Pointer-   schedule 01.01.2018