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

#bash #cat

#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-документа подвергаются расширению параметров,
замене команд и арифметическому расширению, последовательность символов
игнорируется, а должен использоваться для кавычек символов ,
$ и `.

Если оператор перенаправления равен <<- , то все начальные символы табуляции удаляются из строк ввода и строки, содержащей разделитель. Это позволяет здесь-документам в сценариях оболочки иметь отступ естественным образом. [Курсив добавлен.]

Комментарии:

1. ах! это то, что я искал.

2. К сожалению, это не интуитивно понятно … но я рад, что оно существует!

Ответ №2:

Поместите обратную реакцию перед знаком $

 $ VAR=XXX
$ cat << END
> dk
> $VAR
> END
dk
$VAR
  

Комментарии:

1. Я знаю об этом. В моем heredoc их много — слишком легко пропустить один или несколько.