Подтвердить что ты не робот

Как кот <<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

Я попытался поставить одинарные кавычки, но вывод также содержит одинарные кавычки с ним. Как я могу избежать этой проблемы?

4b9b3361

Ответ 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"