Так, давай сегодня обмусолим «HEREDOC». На вписках башников его гордо величают «Хердок».



Что это такое? Ну смотри, допустим ты пишешь башник и оказываешься в ситуации, когда тебе нужно передать многострочный кусок текста, какой-нибудь команде типа cat, tee, ssh и т.п.



Вот с помощью «хердок» такое можно провернуть. Пока не очень понятно, давай разбираться на примерах.



cat << EOF

SUKA BLYA CURRENT DIR: $PWD

YOU ARE LOGGED IN ASS: $(whoami)

EOF



В этом примере я передаю команде cat две строки текста, в первой есть переменная среды PWD, во второй команда whoami.



По итогу выхлоп будет такого плана:



SUKA BLYA CURRENT DIR: /home/user

YOU ARE LOGGED IN ASS: user



Как видишь PWD и $(whoami) автоматически подставились. Ну и главная фича, что я не использовал для вывода команду echo. При другом раскладе код был бы таким:



echo "SUKA BLYA CURRENT DIR:" $PWD

echo "YOU ARE LOGGED IN ASS:" $(whoami)



Согласись, что с «хердоком» это выглядит более лаконичным. Не нужно писать 100500 echo. Хердокаешь и меньше говнокода становится.



Теперь давай выполним такой код:



cat << "EOF"

SUKA BLYA CURRENT DIR: $PWD

YOU ARE LOGGED IN ASS: $(whoami)

EOF



Заключив EOF в кавычки, я запретил заменять переменные, команды и спецсимволы.



Короче на экран выведется такая шляпа:



SUKA BLYA CURRENT DIR: $PWD

YOU ARE LOGGED IN ASS: $(whoami)



Видал да? PWD и $(whoami) не заменились, а остались в прежнем виде. Заебись Хорошо!



Теперь давай рассмотрим такую конструкцию:



cat <<- EOF

Hello

Bitch

EOF



В первой строке я добавил символ «-».



Символ «-» приводит к игнорированию всех ведущих символов табуляции, что позволяет использовать отступы в синтаксисе «хердока». Пробелы не допускаются, только символ табуляции.



Перед «Привет» и «Пляж» я нажал TAB. Короче символ «-» позволяет делать отступы в коде с лидирующим Табом.



Не знаю, я этим минусом вообще не пользуюсь, мне хватает того, что есть в коробке.



Теперь запускаем такое:



cat << EOF > output.txt

SLUNI DO POLU $PWD

HERANUKA PO ROYALU $(whoami)

EOF



А чо произошло? Хе… а весь выхлоп, который должен был вывестись на экран — сохранился в файл output.txt. Вот такая магия! Если файл не существует, то создастся новый.



Ну а если хочешь файл дополнить, то вместо «>» используй двойные символы «>>», но думаю ты это и так знаешь.



Передавать поток, можно не только в файл, но и в другие команды. Давай возьмем sed:



cat <<'EOF' | sed 's/i/ee/g'

Rich

Bitch

EOF



По итогу получим, что все символы «i» заменятся на «ee». На экран выведется:



Reech

Beetch



Конструкция напоминает франкенштейна, но если базу понимать, то все легко и просто. Но я думаю, что хорошо объясняю и тебе всё понятно. Если чо, спрашивай в комментах, раскидаем.



Ну и как обычно на закуску, практическое применение этого самого «хердока»:



ssh -T [email protected] << EOF

ls -la

date

apt update

uptime

cat /etc/issue

EOF



Конектимся по ssh на сервер и выполняем пачкой задачи. Получается засылаем подготовленный пакет с командами и что-то делаем. Можно сделать скрипт базовой настройки сервера, чтобы ansible к примеру не городить. А можно циклом пройтись по списку серверов и избавиться от продакшена.



Если продакшен перестал падать, значит его больше нет, значит по ночам тебя перестанут будить.



На этой ноте, собственно всё. Больше тут и рассказать нечего.



Я редко пользуюсь «хердоком», но часто встречаю его в чужих скриптах. Тут скорее важен момент понимания, что происходит, а не момент использования. Вот теперь ты знаешь и сможешь читать более вдумчиво чужой говнокод.



Давай! Еще раз хороших тебе выходных, увидимся!



tags: #bash #linux



💩 @bashdays