На этот вопрос уже есть ответ здесь:
Я новичок в сценариях Linux, сталкиваюсь с некоторыми командами, но не понимаю их.
cat <<- _EOF_
command1
command2
command3
_EOF_
Кроме того,
less <<- _EOF
command1
command2
command3
_EOF
Так может ли кто-нибудь мне их объяснить?
В коде программы необходимо отметить, какие части предназначены, чтобы быть командами и которые предназначены, чтобы быть данными. На типичном типе данных строки, означая последовательности символов (буквы, цифры и т.д.)
Существуют различные способы указать на строковые литералы. Наиболее распространенный способ состоит в том, чтобы заключить строковые данные в кавычки:
PATH="/home/user"
USER='joe'
Но может быть трудно обработать строковые литералы, которые дольше и/или включают разрывы строки:
MESSAGE="This is a relatively long string which isn't represented very well as a typical quoted string.\nAnd there are linebreaks in it."
Для таких случаев, вероятно, требуется смочь сказать: "Рассматривайте следующее как строку, пока я не скажу Вам иначе". И это точно, что здесь делает документ. Это - другой способ показать строковый литерал. Вы определяете маркер, который показывает конец Вашего текста, затем помещает Ваш текст, затем маркер:
MESSAGE=<< EOF
Here be a long string.
With line breaks.
EOF
Вы свободны выбрать маркер, но это обычно - что-то как EOF ("конец файла"), eot ("конец текста") или подобный. Вы, возможно, выбрали "ABC" все равно
MESSAGE=<< ABC
Here be a long string.
With line breaks.
ABC
"Здесь документы", также известный как "heredocs", "здесь-строки" или подобный, произошли в оболочках Unix как bash
и может сегодня быть найден на большом количестве языков программирования.
В оболочках они работают немного по-другому, поскольку они не представляют строки так, как они представляют файлы. Так, например
cat << EOF
One
EOF
эквивалентно
cat data.txt # where data.txt contains 'One'
Вариант с <<-
вместо' <<' игнорирует ведущий пробел в heredoc данных, таким образом, можно сделать код более читаемым identing heredoc:
cat <<- EOF
One
Two
Three
EOF