#linux #bash #variables #at-utility
#bash #синтаксис #heredoc
Вопрос:
Возможно ли создать heredoc, который не подвергается расширению переменной?
например
cat <<-EOF > somefile.sh
Do not print current value of $1 instead evaluate it later.
EOF
Обновление Я знаю об экранировании с помощью
. В моем реальном heredoc есть много переменных — и избегать их всех подвержено ошибкам и утомительно.
Комментарии:
1. При использовании
$var
переменная не будет расширяться2. Это не то, что я имел в виду. Я обновлю OP.
3. Для меня это тоже проблема. Поскольку функции не распознаются в конвейерах без загрузки экспорта и всякой ерунды с подоболочками, я использую here docs, переданные во временные файлы, для определения вспомогательных функций, и это становится поиском сокровищ, пытаясь выяснить, чего я не избежал в heredoc.
Ответ №1:
Заключите разделитель в кавычки:
cat <<-"EOF" > somefile.sh
Do not print current value of $1 instead evaluate it later.
EOF
Это приводит к:
$ cat somefile.sh
Do not print current value of $1 instead evaluate it later.
Документация
Формат here-документов такой:
<<[-]word here-document delimiter
В word не выполняется расширение параметров и переменных, подстановка команд, арифметическое расширение или расширение имени пути. Если какие-либо символы в word заключены в кавычки, разделитель является результатом удаления кавычек в word, и строки в here-документе не раскрываются.Если word не заключен в кавычки, все строки here-документа подвергаются расширению параметра, команда
подстановка и арифметическое расширение последовательности символов
игнорируется и должен использоваться для заключения символов в кавычки ,
$, и `.Если оператор перенаправления равен <<- , то все начальные символы табуляции удаляются из строк ввода и строки, содержащей разделитель. Это позволяет размещать отступы в документах here в сценариях оболочки естественным образом. [Выделено мной.]
Комментарии:
1. ах! это то, что я искал.
2. К сожалению, это не интуитивно понятно … но я рад, что это существует!
Ответ №2:
Поместите обратную реакцию перед знаком $
$ VAR=XXX
$ cat << END
> dk
> $VAR
> END
dk
$VAR
Комментарии:
1. Я в курсе этого. В моем heredoc их много — слишком легко пропустить один или несколько.