Как я могу отобразить "$" в документах here в bash?
Например, я хочу иметь файл с содержимым на удаленном сервере, как $ABC=home_dir
.
$ ssh hostname sudo -s <<EOF
echo "$ABC=home_dir" > file
EOF
Но это будет рассматриваться как переменная. Как я могу напечатать литерал $
?
scp
это?Ответы:
Если вы хотите написать здесь документ и не хотите, чтобы ЛЮБОЙ документ был расширен или какие-либо специальные символы интерпретировались, вы можете заключить в ярлык одинарные кавычки, например:
Однако ваша ситуация, описанная в вашем примере, намного сложнее, потому что вы действительно отправляете этот контент через ssh в удаленную систему, чтобы запустить sudo, которая также вызывает оболочку (и поэтому оболочка будет расширять содержимое также). Вам понадобятся дополнительные уровни цитирования, чтобы получить это право, но даже при этом он все равно не будет работать, потому что для sudo требуется терминал (чтобы он мог запрашивать пароль), и вы перенаправлены из stdin. Даже использование
ssh -t
здесь не поможет.Также я согласен с Йоханом. Не ясно, действительно ли это то, что вы хотите; обратите внимание, что присвоение значения для ссылки на переменную оболочки недопустимо, поэтому если этот файл, который вы пытаетесь создать, должен быть сценарием оболочки, он не будет работать так, как вы его описали. Может быть, если вы сделаете резервную копию и опишите, что вы действительно хотите сделать, мы можем помочь больше.
источник
Избежать
$
Я не знаю, каков ваш вариант использования, но обычно вы хотите
home_dir=$ABC
вместо$ABC=home_dir
.источник
=home_dir
в файл? Конечно, я не знаю, каков вариант использования ...$
к отправке литерала в удаленную оболочку, но затем эта оболочка развернется,$ABC
прежде чем отобразить строкуfile
. Чтобы записать литерал$
в файл, вам понадобится еще одна (экранированная) обратная косая черта:,echo "\\\$ABC=home_dir"
чтобы удаленная оболочка получилаecho "\$ABC=home_dir"
.Самый дешевый способ избежать
источник
Вы сохраняете себе уровень цитирования, отправляя строку
cat
процессу на удаленном конце:Одинарные кавычки защищают
$
на локальном конце, и строка никогда не видна оболочкой на другом, потому что она читается напрямуюcat
(черезsudo
), а не является аргументом для другой команды оболочки.С вашим кодом вам понадобится дополнительный уровень экранирования для защиты
$
:Вам необходимо отправить литерал
\$
на удаленный хост, чтобы удаленная оболочка записала литерал$
в файл. Вы также можете упростить это, указав маркер here-doc:источник