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