Я пытаюсь интерполировать переменные внутри bash heredoc:
var=$1
sudo tee "/path/to/outfile" > /dev/null << "EOF"
Some text that contains my $var
EOF
Это не работает, как я ожидал ( $var
трактуется буквально, а не расширенно).
Мне нужно использовать, sudo tee
потому что создание файла требует sudo. Делать что-то вроде:
sudo cat > /path/to/outfile <<EOT
my text...
EOT
Не работает, потому что >outfile
открывает файл в текущей оболочке, которая не использует sudo.
''
), но не цитирование разделителя включает расширение (как если бы оно было""
). Тем не менее, ваша интуиция верна в Perl, где heredoc с идентификатором в одинарных кавычках ведет себя так, как если бы он был в одинарных кавычках, один с идентификатором в двойных кавычках, как будто в двойных кавычках, и один с идентификатором в обратном тиканье, как будто в обратных галочках ! Смотрите: perlop: << EOFОтветы:
В ответ на ваш первый вопрос нет подстановки параметров, потому что вы поместили разделитель в кавычки - руководство по bash говорит :
Если вы измените свой первый пример на использование
<<EOF
вместо, то<< "EOF"
вы обнаружите, что он работает.Во втором примере оболочка вызывается
sudo
только с параметромcat
, а перенаправление применяется к выводу отsudo cat
имени исходного пользователя. Это сработает, если вы попробуете:источник
(cat > /path/to/outfile) <<EOF
вместоsudo sh -c ... <<EOF
Не используйте кавычки с
<<EOF
:Расширение переменной является поведением по умолчанию внутри here-документов. Вы отключаете это поведение, заключая в кавычки (одинарные или двойные кавычки).
источник
Как поздний вывод из предыдущих ответов, вы, вероятно, окажетесь в ситуациях, когда вы хотите, чтобы некоторые, но не все переменные были интерполированы. Вы можете решить эту проблему, используя обратную косую черту, чтобы избежать знаков доллара и обратных кавычек; или вы можете поместить статический текст в переменную.
Демо: https://ideone.com/rMF2XA
Обратите внимание, что любой из механизмов цитирования -
\____HERE
или"____HERE"
или'____HERE'
- отключит интерполяцию всех переменных и превратит документ здесь в фрагмент буквального текста.Обычной задачей является объединение локальных переменных со скриптом, который должен оцениваться другой оболочкой, языком программирования или удаленным хостом.
источник