Как кот <<EOF>> файл с кодом? в ракушке
Я хочу напечатать код в файл с помощью 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
Я попытался поставить одинарные кавычки, но вывод также содержит одинарные кавычки с ним. Как я могу избежать этой проблемы?
Ответы
Ответ 1
Вам нужно только минимальное изменение; одинарная кавычка: разделитель здесь-документа после <<
.
cat <<'EOF' >> brightup.sh
или эквивалентно обратная косая черта - избегайте его:
cat <<\EOF >>brightup.sh
Без цитирования здесь документ будет подвергаться переменной замене, обратные ссылки будут оцениваться и т.д., как вы обнаружили.
Ответ 2
Или, используя маркеры EOF, вам нужно указать начальный маркер, чтобы расширение не выполнялось:
#-----v---v------
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
IHTH
Ответ 3
Это должно сработать, я только что протестировал его, и он работал как ожидалось: никакого расширения, замены или того, что было у вас произошло.
cat <<< '
#!/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' > file # use overwrite mode so that you don't keep on appending the same script to that file over and over again, unless that what you want.
Использование также работает.
cat <<< ' > file
... code ...'
Кроме того, стоит отметить, что при использовании heredocs, таких как << EOF
, происходит замещение и расширение переменных и тому подобное. Итак, сделаем что-то вроде этого:
cat << EOF > file
cd "$HOME"
echo "$PWD" # echo the current path
EOF
всегда приведет к расширению переменных $HOME
и $PWD
. Поэтому, если ваш домашний каталог /home/foobar
, а текущий путь /home/foobar/bin
, file
будет выглядеть следующим образом:
cd "/home/foobar"
echo "/home/foobar/bin"
вместо ожидаемого:
cd "$HOME"
echo "$PWD"