it-swarm.com.ru

Создание выходного файла с многострочным скриптом с использованием echo/linux

Попытка создать небольшой сценарий, способный записать часть из сценария в выходной файл без каких-либо изменений (как есть)

текст исходного файла

echo "
yellow=`tput setaf 3`
bel=`tput bel`
red=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0
echo"#${green}Installing packages${reset}#" &&
" >> output.txt

Желаемый результат:

yellow=`tput setaf 3`
bel=`tput bel`
red=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0
echo"#${green}Installing packages${reset}#" &&

Что я получаю это: 

yellow=^[[33m
bel=^G
red=^[[31m
green=^[[32m
reset=^[(B^[[m
echo"#${green}Installing packages${reset}#" &&

Использование CentOS 7 Минимальная свежая установка Ищите решение, которое будет применено к полному сценарию/тексту, без изменения строки на строку, я полагаю, что это может быть сделано с помощью sed тоже ...

6
Zaza

Вам нужно убежать от галочек (`):

#!/bin/bash
echo "
yellow=\`tput setaf 3\`
bel=\`tput bel\`
red=\`tput setaf 1\`
green=\`tput setaf 2\`
reset=\`tput sgr0\`
" >> output.txt

В качестве бонуса:

Я предпочитаю использовать этот метод для многострочного:

#!/bin/bash
cat << 'EOF' >> output.txt
yellow=$(tput setaf 3)
bel=$(tput bel)
red=$(tput setaf 1)
green=$(tput setaf 2)
reset=$(tput sgr0)
EOF
20
N1ckles

Используйте одинарную кавычку для предотвращения расширений:

echo '
yellow=`tput setaf 3`
bel=`tput bel`
red=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0`
' >> output.txt

Для более подробной информации смотрите Разница между двойной и одинарной кавычкой .


Если ваш текст включает в себя одинарные кавычки, то выше может не сработать. В этом случае использование здесь doc будет безопаснее. Например, вышеупомянутое сломается, если вы вставите строку: var='something'

Используя здесь документ, это будет так:

cat >> output.txt <<'EOF'
yellow=`tput setaf 3`
bel=`tput bel`
red=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0`
var='something'
EOF
4
Jahid

Просто позднее добавление: 

Командаecho 'string' >> outputпроста и великолепна. Но это может привести к ошибке '...: Permission denied' в сочетании с Sudo.

У меня недавно была проблема с судо echo 'string \n other string \n' > /path/to/file

Что сработало для меня лучше всего:
printf "Line1\nLine2\nLine3" | Sudo tee --append /path/to/file

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

0
Gergely M

Благодаря Чепнер

Лучшее решение, которое я нашел, это:

echo '
yellow=$(tput setaf 3)
bel=$(tput bel)
red=$(tput setaf 1)
green=$(tput setaf 2)
reset=$(tput sgr0)
echo"#${green}Installing packages${reset}#"
' >> output

При таком решении весь текст поступает в выходной файл без изменений, а определения цветов также работают без изменений.

0
Zaza