POSIX 7
kennytm в кавычках man bash
, но большей частью это также POSIX 7: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_07_04:
Операторы перенаправления "<<" и«<< -» оба позволяют перенаправлять строки, содержащиеся во входном файле оболочки, известном как «здесь-документ», на ввод команды. </p>
Здесь-документ должен рассматриваться как одно словокоторый начинается после следующего и продолжается до тех пор, пока не появится строка, содержащая только разделитель и a, без символов между ними.Затем начинается следующий документ здесь, если он есть.Формат выглядит следующим образом:
[n]<<word
here-document
delimiter
, где необязательный n представляет номер дескриптора файла.Если число опущено, здесь документ относится к стандартному вводу (дескриптор файла 0).
Если любой символ в слове заключен в кавычки, разделитель должен быть сформирован путем удаления кавычки для слова, а здесь -строки документа не должны быть расширены.В противном случае разделителем должно быть само слово.
Если символы в слове не заключены в кавычки, все строки документа здесь должны быть расширены для расширения параметров, подстановки команд и арифметического расширения.В этом случае входные данные ведут себя как внутренние двойные кавычки (см. Двойные кавычки).Однако символ двойной кавычки ('"') не должен обрабатываться специально в документе здесь, за исключением случаев, когда двойная кавычка появляется внутри" $ () "," `` "или" $ {} ".
Если символ перенаправления равен «<< -», все начальные символы <code><tab> должны быть удалены из строк ввода и строки, содержащей конечный разделитель. Если более одного «<<» или «<< -»оператор указывается в строке, здесь документ, связанный с первым оператором, должен быть сначала предоставлен приложением и должен быть сначала прочитан оболочкой. </p>
Когда документ здесь читается с оконечного устройства иоболочка является интерактивной, она должна записать содержимое переменной PS2, обработанной, как описано в разделе «Переменные оболочки», в стандартную ошибку перед чтением каждой строки ввода, пока не будет распознан разделитель.
Примеры
Некоторые примеры еще не приведены.
Кавычки запрещают расширение параметров
Без кавычек:
a=0
cat <<EOF
$a
EOF
Вывод:
0
СQuotes:
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
здесь.Хлоп.