Как подавить подстановку переменных в bash heredocs

#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 их много — слишком легко пропустить один или несколько.