Я хочу напечатать код в файле, используя cat <<EOF >>
:
cat <<EOF >> brightup.sh
!/bin/bash
curr=`cat /sys/class/backlight/intel_backlight/actual_brightness`
if [ $curr -lt 4477 ]; then
curr=$((curr+406));
echo $curr > /sys/class/backlight/intel_backlight/brightness;
fi
EOF
но когда я проверяю вывод файла, я получаю следующее:
!/bin/bash
curr=1634
if [ -lt 4477 ]; then
curr=406;
echo > /sys/class/backlight/intel_backlight/brightness;
fi
Я попытался поставить одинарные кавычки, но результат также содержит одинарные кавычки. Как я могу избежать этой проблемы?
#!/bin/bash
и ничего больше -#!
это то, что делает ее действительной строкой shebang, а то, что идет после нее, - это путь к интерпретатору.man bash
и искатьHere Documents
. Все подробности есть.$(command)
вместо`command`
. Для получения содержимого файла у Bash есть$(<file)
Ответы:
Вам нужно только минимальное изменение; заключите в одинарные кавычки разделитель здесь-документа после
<<
.или, что то же самое, экранировать его:
Без кавычек в данном документе будет произведена подстановка переменных, будут оцениваться обратные кавычки и т. Д., Как вы обнаружили.
Если вам нужно расширить некоторые, но не все, значения, вам нужно индивидуально избежать тех, которые вы хотите предотвратить.
будет производить
Как предлагает @fedorqui , вот соответствующий раздел из
man bash
:источник
Или, используя маркеры EOF, вам нужно указать начальный маркер в кавычки, чтобы расширение не производилось:
IHTH
источник
Это должно сработать, я только что проверил, и все сработало, как ожидалось: ни расширения, ни замены, ни чего-то еще.
Также работает следующее.
Также стоит отметить, что при использовании heredocs, таких как
<< EOF
подстановка, расширение переменных и т.п. Итак, делаем что-то вроде этого:всегда будет приводить к раскрытию переменных
$HOME
и$PWD
. Итак, если ваш домашний каталог/home/foobar
и текущий путь есть/home/foobar/bin
, онfile
будет выглядеть так:вместо ожидаемого:
источник
<<<
доступны только начиная с Bash 3 и не переносятся в другие оболочки.<<<
также доступно на ZshЯ знаю, что это вопрос двухлетней давности, но это быстрый ответ для тех, кто ищет «как».
Если вы не хотите заключать что-либо в кавычки, вы можете просто записать блок текста в файл и экранировать переменные, которые вы хотите экспортировать как текст (например, для использования в скрипте), и не экранировать те, которые вы хотите экспорт как значение переменной.
Запишет "$ {VAR_EXAMPLE} =" string "in test.txt" в test.txt
Это также можно использовать для вывода блоков текста на консоль по тем же правилам, опуская имя файла.
Будет выводить "$ {VAR_EXAMPLE} =" string "to console" на консоль
источник