25.10.2023 17:27
Occul
 
Итак, речь про «HEREDOC». На вписках башников его гордо величают «Хердок».

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

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

Код:
cat << EOF
HEREDOC CURRENT DIR: $PWD
YOU ARE LOGGED IN ASS: $(whoami)
EOF
В этом примере я передаю команде cat две строки текста, в первой есть переменная среды PWD, во второй команда whoami.

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

Код:
HEREDOC CURRENT DIR: /home/user
YOU ARE LOGGED IN ASS: user
Как видишь PWD и $(whoami) автоматически подставились. Ну и главная фича, что я не использовал для вывода команду echo. При другом раскладе код был бы таким:

Код:
echo "HEREDOC CURRENT DIR:" $PWD
echo "YOU ARE LOGGED IN ASS:" $(whoami)
Согласись, что с «хердоком» это выглядит более лаконичным. Не нужно писать 100500 echo. Хердокаешь и меньше говнокода становится.

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

Код:
cat << "EOF"
HEREDOC CURRENT DIR: $PWD
YOU ARE LOGGED IN ASS: $(whoami)
EOF
Заключив EOF в кавычки, я запретил заменять переменные, команды и спецсимволы.

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

Код:
HEREDOC 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 host << EOF
ls -la
date
apt update
uptime
cat /etc/issue
EOF
Конектимся по ssh на сервер и выполняем пачкой задачи. Получается засылаем подготовленный пакет с командами и что-то делаем. Можно сделать скрипт базовой настройки сервера, чтобы ansible к примеру не городить. А можно циклом пройтись по списку серверов и избавиться от продакшена.

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

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

Я редко пользуюсь «хердоком», но часто встречаю его в чужих скриптах. Тут скорее важен момент понимания, что происходит, а не момент использования. Вот теперь ты знаешь и сможешь читать более вдумчиво чужой говнокод.
28.10.2023 17:34
Капитан О.
 
«Хердок» (также известный как "here document" или "heredoc") в программировании является способом передачи многострочного текста как аргумента команды или ввода. В примере, который вы привели, используется «хердок» для передачи двух строк текста команде cat.

Формат использования «хердока» выглядит следующим образом:
Код:
bash
command <<EOF
line1
line2
EOF
Где command - команда, которой нужно передать текст, и EOF - фиктивный маркер, который указывает начало и конец «хердока». Все строки между маркерами будут переданы команде.

В вашем примере используется переменная среды PWD (текущая рабочая директория) и команда whoa. При выполнении команды cat с «хердоком», значения переменных подставляются автоматически, и в результате будет показан текст, содержащий значение текущей рабочей директории и результат выполнения команды whoa.

Надеюсь, это помогло вам понять, что такое «хердок» и как его можно использовать для передачи многострочного текста командам.
Часовой пояс GMT +3, время: 23:47.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.