Как работает cat > file << "END"?

BEGIN { RS="=====*\n" }
/Queue Manager/ {
    manager = $0; next;
}
/[a-z]/ {
    print RT manager RT $0;
}

Первое правило устанавливает в качестве разделителя записи четыре или более знаков равенства. Второе правило отслеживает «заголовок», то есть запись, содержащую строку «Queue Manager». Третье правило печатает заголовок и текущую запись, если запись содержит хотя бы одну строчную букву, т.е. не пуста.

3
19.02.2017, 15:01
1 ответ

Кажется, ваша проблема не в том, как работают здесь-документы , поскольку вы правильно описали их использование в файлах сценариев. Похоже, вы не понимаете их интерактивного использования. Ниже приводится (очень упрощенный) ускоренный курс, который, надеюсь, прояснит вам этот вопрос.

Оболочки, как и все процессы Unix в целом, имеют потоки ввода и вывода для чтения и записи данных туда и обратно. У них есть как минимум один входной поток (называемый stdin ) и два выходных потока ( stdout и stderr ), но они могут открывать и закрывать столько, сколько захотят. , для чтения и записи (в основном, для чтения из файлов или записи в них). От них зависит, что процессы делают со своими потоками. cat , например, при вызове без аргументов копирует свой stdin в stdout . Оболочки обычно интерпретируют свои входные потоки как команды, которые должны быть выполнены (и настраивают входные и выходные потоки для этих команд в соответствии с некоторым синтаксисом).

Откуда берутся входные данные? Они могут поступать от других процессов, отправляющих их, их можно читать из файлов или вводить непосредственно пользователем, что является наиболее нормальной ситуацией для stdin оболочки. В этом случае должна существовать другая программа, принимающая вводимые пользователем данные и загружающая их в поток. Такая программа называется tty , и в этом случае мы говорим, что поток подключен к tty ( tty отличается от терминала программа эмуляции, которая предоставляет для этого окно, но вы также можете, в общих чертах, сказать, что поток подключен к терминалу. )

Оболочки знают, когда прикреплен их stdin на tty и ведут себя по-другому, например, выводят приглашение при ожидании ввода, но на самом деле других различий не так много. Приглашение обычно выглядит примерно так: user @ host: current_path $ . Его точное содержимое можно определить, изменив переменную PS1 . Обычно он заканчивается на $ , если вы обычный пользователь, и на # , когда вы root .

Когда вы выполняете сценарий, оболочка присоединяет входной поток к файлу, содержащему его, и считывает из него команды.Если одна из команд содержит здесь-документ , то есть что-то вроде << END , это означает: с этого момента, вплоть до строки, содержащей только этот терминатор, остановить интерпретировать данные потока как команды и передавать их на stdin команды, которую вы собираетесь выполнить ( cat в вашем случае), возможно, с некоторыми искажениями, которые нас сейчас не побеспокоят . Это то, что вы уже знаете, хотя, возможно, и с другой точки зрения.

Когда ввод прикреплен к tty , здесь-документ означает то же самое: прекратить интерпретацию данных потока как команды и передать их на stdin команды, которую вы используете собираются казнить, вплоть до терминатора. Единственное отличие состоит в том, что при ожидании ввода выводите подсказку; это приглашение отличается от того, которое оболочка напечатала бы, если бы собиралась интерпретировать входные данные как команды, просто чтобы вы знали, что они будут переданы. Он определяется переменной PS2 и по умолчанию имеет значение > . Вы видите его в начале каждой строки после ввода cat file> file << "END" , пока терминатор не будет прочитан, когда оболочка возобновит свое нормальное поведение, напечатает свой PS1 -prompt и ожидает, пока ввод будет интерпретирован как команды.

12
27.01.2020, 21:11

Теги

Похожие вопросы