Мне нужно было написать скрипт для ввода многострочного ввода в программу ( psql
).
После небольшого поиска я нашел следующий синтаксис:
cat << EOF | psql ---params
BEGIN;
`pg_dump ----something`
update table .... statement ...;
END;
EOF
Это правильно создает многострочную строку (от BEGIN;
до END;
, включительно) и передает ее в качестве входных данных psql
.
Но я понятия не имею, как / почему это работает, может кто-нибудь объяснить, пожалуйста?
Я имею в виду cat << EOF
, я знаю, >
вывод в файл, >>
добавляет в файл, <
читает входные данные из файла.
Что <<
именно делает?
И есть ли справочная страница для этого?
cat
. Попробуйтеpsql ... << EOF ...
см. Также «здесь строки». mywiki.wooledge.org/BashGuide/InputAndOutput?#Here_Stringscat
читает stding (при передаче по нему) или читает файл, который соответствует его аргументам командной строкиОтветы:
Это называется форматом heredoc для предоставления строки в стандартный ввод. См. Https://en.wikipedia.org/wiki/Here_document#Unix_shells для получения дополнительной информации.
От
man bash
:источник
<<-
пожалуйста, обратите внимание, что удаляются только начальные символы вкладки, а не символы программной вкладки. Это один из тех редких случаев, когда вам действительно нужен символ табуляции. Если в остальной части документа используются мягкие вкладки, убедитесь, что отображаются невидимые символы и (например) скопируйте и вставьте символ вкладки. Если вы все сделаете правильно, ваша подсветка синтаксиса должна правильно поймать конечный разделитель.cat <<EOF
Синтаксис очень полезен при работе с многострочным текстом в Bash, например. при назначении многострочной строки переменной оболочки, файлу или каналу.Примеры
cat <<EOF
использования синтаксиса в Bash:1. Присвойте многострочную строку переменной оболочки
$sql
Переменная теперь держит символы новой строки тоже. Вы можете проверить с помощьюecho -e "$sql"
.2. Передать многострочную строку в файл в Bash
print.sh
Файл теперь содержит:3. Передайте многострочную строку в трубу в Bash.
b.txt
Файл содержитbar
иbaz
строки. Тот же вывод выводится наstdout
.источник
В вашем случае, «EOF» известен как «Здесь тег». В основном
<<Here
говорит оболочке, что вы собираетесь вводить многострочную строку до появления «тега»Here
. Вы можете назвать этот тег, как вы хотите, это частоEOF
илиSTOP
.Некоторые правила о тегах Here:
пример:
источник
<<-
использовании начальная вкладка не помешает распознаванию тегаPOSIX 7
процитированный kennytm
man bash
, но большая часть этого также POSIX 7: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_07_04 :Примеры
Некоторые примеры еще не приведены.
Кавычки препятствуют расширению параметров
Без кавычек:
Вывод:
С цитатами:
или (некрасиво, но верно):
Выходы:
Дефис удаляет ведущие вкладки
Без дефиса:
где
<tab>
буквенная вкладка, и может быть вставлен сCtrl + V <tab>
Вывод:
С дефисом:
Вывод:
Конечно, это существует, так что вы можете сделать отступ,
cat
как и окружающий код, который легче читать и поддерживать. Например:К сожалению, это не работает с пробелами: здесь POSIX поддерживает
tab
отступы. Хлоп.источник
<<-
и<tab>a
, следует отметить, что цель состояла в том, чтобы обеспечить нормальный отступ кода в скрипте, при этом текст heredoc, представляемый процессу получения, начинается в столбце 0. Это не слишком часто встречаемая функция и немного больше контекста может помешать много почесать голову ...$
"$a"'$b'"$c"
, но здесь нет аналога AFAIK.Используя тройник вместо кошки
Не совсем как ответ на первоначальный вопрос, но я все равно хотел поделиться этим: мне нужно было создать файл конфигурации в каталоге, который требовал наличия прав root.
Следующее не работает для этого случая:
потому что перенаправление обрабатывается вне контекста sudo.
В итоге я использовал это вместо:
источник
Небольшое продолжение вышеприведенных ответов. Трейлинг
>
направляет ввод в файл, перезаписывая существующий контент. Тем не менее, одно особенно удобное использование - это двойная стрелка,>>
которая добавляет новое содержимое в конец файла, как показано ниже:Это позволяет вам
fstab
не беспокоиться о случайном изменении любого его содержимого.источник
Это не обязательно ответ на первоначальный вопрос, а обмен некоторыми результатами моего собственного тестирования. Эта:
создаст тот же файл, что и:
Так что я не вижу смысла в использовании команды cat.
источник
<<test
безcat <<test
.Стоит отметить, что здесь документы также работают в циклах bash. В этом примере показано, как получить список столбцов таблицы:
или даже без новой строки
источник