При написании сценариев оболочки вы можете оказаться в ситуации, когда вам нужно передать многострочный блок текста или кода интерактивной команде, такой как tee
, cat
или sftp
.
В Bash и других оболочках, таких как Zsh, документ Here (Heredoc) — это тип перенаправления, позволяющий передавать команде несколько строк ввода.
Содержание
Синтаксис HereDoc
Синтаксис написания HereDoc имеет следующий вид:
[COMMAND] <<[-] 'DELIMITER'
HERE-DOCUMENT
DELIMITER
- Первая строка начинается с необязательной команды, за которой следует специальный оператор перенаправления
<<
и ограничивающий идентификатор.- В качестве идентификатора-разделителя можно использовать любую строку, наиболее часто используемые — EOF или END.
- Если ограничивающий идентификатор не заключен в кавычки, оболочка заменит все переменные, команды и специальные символы перед передачей команд здесь строк документа.
- Добавление знака минус к оператору перенаправления
<<-
приведет к игнорированию всех ведущих символов табуляции. Это позволяет использовать отступы при написании здесь-документов в сценариях оболочки. Начальные пробелы не допускаются, только табуляция.
- Блок здесь-документа может содержать строки, переменные, команды и любой другой тип ввода.
- Последняя строка заканчивается идентификатором-разделителем. Пробелы перед разделителем не допускаются.
Основные примеры Heredoc
В этом разделе мы рассмотрим несколько основных примеров использования heredoc.
Heredoc чаще всего используется в сочетании с командой cat .
В следующем примере мы передаем в cat
две строки текста, содержащие переменную среды и команду, используя здесь документ.
cat << EOF
The current working directory is: $PWD
You are logged in as: $(whoami)
EOF
Как видно из вывода ниже, подставляются как переменная, так и вывод команды:
The current working directory is: /home/linuxize
You are logged in as: linuxize
Посмотрим, что будет, если мы заключим разделитель в одинарные или двойные кавычки.
cat <<- "EOF"
The current working directory is: $PWD
You are logged in as: $(whoami)
EOF
Вы можете заметить, что, когда ограничитель заключен в кавычки, оболочка не выполняет расширение параметров и подстановку команд.
The current working directory is: $PWD
You are logged in as: $(whoami)
Если вы используете heredoc внутри оператора или цикла, используйте операцию перенаправления <<-
которая позволяет сделать отступ в коде.
if true; then
cat <<- EOF
Line with a leading tab.
EOF
fi
Line with a leading tab.
Вместо отображения вывода на экране вы можете перенаправить его в файл с помощью операторов >
, >>
.
cat << EOF > file.txt
The current working directory is: $PWD
You are logged in as: $(whoami)
EOF
Если файл file.txt не существует, он будет создан. При использовании >
файл будет перезаписан, а символ >>
добавит вывод в файл.
Вход heredoc также может быть передан по конвейеру. В следующем примере команда sed
заменит все экземпляры символа l
на e
:
cat <<'EOF' | sed 's/l/e/g'
Hello
World
EOF
Heeeo
Wored
Чтобы записать передаваемые данные в файл:
cat <<'EOF' | sed 's/l/e/g' > file.txt
Hello
World
EOF
Использование Heredoc с SSH
Использование Heredoc — один из самых удобных и простых способов выполнения нескольких команд в удаленной системе через SSH .
При использовании разделителя без кавычек убедитесь, что вы экранировали все переменные, команды и специальные символы, иначе они будут интерполированы локально:
ssh -T [email protected] << EOF
echo "The current local working directory is: $PWD"
echo "The current remote working directory is: $PWD"
EOF
The current local working directory is: /home/linuxize
The current remote working directory is: /home/user
Вы также можете настроить аутентификацию на основе ключа SSH и подключаться к своим серверам Linux без ввода пароля.
Выводы
В этом руководстве вы узнали, что такое heredoc
и как использовать его в сценариях оболочки.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
Интересный материал. Взял себе на заметку!