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

Echo большой фрагмент текста в файл с помощью Bash

Мне нужно запустить Bash script, который может отображать 300 строк Groovy script в файл tmp. Какой лучший способ сделать это?

Мое текущее решение помещает файл script онлайн и загружает его.

4b9b3361

Ответ 1

Используйте синтаксис heredoc для вставки другого script в оболочку script:

cat > file.tmp <<'endmsg'
script goes here...
endmsg

Ответ 2

Подход heredoc велик, но вы не можете использовать его наивно:

  • Есть проблемы с сохранением пробелов и вкладок в вставленном контенте, которые трудно читать на экране, и могут быть вызваны функциями автоматической очистки вашего текстового редактора.
  • Если маркер конца heredoc, который вы используете, используется в вставленном контенте, операция заканчивается на ранней стадии - проблема, если содержимое имеет собственный heredoc и использует общий маркер, такой как EOF.

Это означает, что наивный подход heredoc может преуспеть или потерпеть неудачу в зависимости от точного содержимого, которое вставлено. Это нарушает принцип наименьшего изумления и опасен, поскольку полуслучайный.

Я предпочитаю подход, когда контент сначала захватывается с помощью base64 uuencode. Это устраняет возможность различного поведения в зависимости от контента, поэтому вам больше не придется об этом думать.

Более безопасный подход:

  • Определите контент для захвата, скажем what.sh
  • uuencode -m whatever.sh whatever.sh >tmp
  • Вставьте содержимое tmp в оболочку script
  • Использовать маркер heredoc, который не может произойти в base64

Окончательный script выглядит следующим образом:

cat > file.tmp <<'_EOF'
begin-base64 644 whatever.sh
bHMgLWxSCmxzIC1sUgpscyAtbFIKbHMgLWxSCmxzIC1sUgpscyAtbFIKbHMg
LWxSCmxzIC1sUgpscyAtbFIKbHMgLWxSCmxzIC1sUgpscyAtbFIKbHMgLWxS
CmxzIC1sUgpscyAtbFIKbHMgLWxSCmxzIC1sUgpscyAtbFIKbHMgLWxSCmxz
IC1sUgpscyAtbFIK
====
_EOF
uudecode file.tmp

Существует небольшая вероятность того, что любая строка данных uuencoded может соответствовать вашему маркеру heredoc. Вероятно, вы не будете использовать маркеры длиной 60 символов:), но последняя строка может быть короче, и есть вероятность, что содержимое uuencoded может случайно совпасть с вашим маркером, если только маркер не использует символ (например, подчеркивание), который не может произойти в кодировке base64. _EOF всегда безопасен.

Также рекомендуется указывать маркер heredoc, например '_EOF', чтобы предотвратить расширение оболочки в блоке. Я не думаю, что полезная нагрузка, основанная на base64, может когда-либо непреднамеренно ссылаться на переменную оболочки, поскольку $ не используется в base64, но цитирование исключает эту возможность. Это также помогает установить привычку всегда ссылаться на маркер heredoc, если нет причины, по которой вы хотите расширить оболочку. Это другое поведение, зависящее от контента, которое сложно, так как кажется случайным. ВСЕГДА указывайте свой маркер heredoc, если вы не знаете, что хотите расширения оболочки внутри блока контента!

Ответ 3

Если вы хотите вывести файл, который требует использования sudo, ответ совершенно неочевиден!

sudo tee /etc/php/conf.d/xdebug.ini > /dev/null <<'TXT'
zend_extension=xdebug.so
xdebug.remote_enable=on
xdebug.remote_autostart=on
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000
xdebug.remote_handler=dbgp
TXT