Перенаправление в Bash
Суперпользователь Linux должен хорошо разбираться в каналах и перенаправлении в Bash. Это важный компонент системы, который часто бывает полезен в области системного администрирования Linux.
Когда вы запускаете команду типа ls
, cat
и т. д., вы получаете некоторый вывод на терминал. Если вы напишете неверную команду, передадите неправильный флаг или неверный аргумент командной строки, вы получите вывод ошибки на терминал. В обоих случаях вам предоставляется некоторый текст. Вам может показаться, что это «просто текст», но система воспринимает этот текст по-другому. Этот идентификатор известен как дескриптор файла (fd).
В Linux существует три файловых дескриптора: STDIN (0); СТАНДАРТНЫЙ ВЫВОД (1) и СТАНДЕРР (2).
STDIN (fd: 0): управляет вводом в терминале.
STDOUT (fd: 1): управляет выводом текста в терминал.
STDERR (fd: 2): управляет текстом ошибки в терминале.
Разница между каналами и перенаправлениями
И каналы , и перенаправления перенаправляют потоки (file descriptor)
выполняемого процесса. Основное отличие состоит в том, что перенаправления связаны с files stream
отправкой выходного потока в файл или отправкой содержимого данного файла во входной поток процесса.
С другой стороны, канал соединяет две команды, отправляя выходной поток первой во входной поток второй. без указания каких-либо переработок.
Перенаправление в Bash
STDIN (стандартный ввод)
Когда вы вводите некоторый входной текст для команды, которая его запрашивает, вы фактически вводите текст в файловый дескриптор STDIN . Запустите cat
команду без каких-либо аргументов командной строки. Может показаться, что процесс остановился, но на самом деле он cat
запрашивает STDIN . cat
это простая программа, которая печатает текст, переданный в STDIN . Однако вы можете расширить вариант использования, перенаправив ввод на команды, принимающие STDIN .
Пример с cat
:
Это просто напечатает предоставленный текст на экране терминала:
То же самое можно сделать и с другими командами, которые принимают входные данные через STDIN. Например wc
:
Флаг -l
с wc
подсчитывает количество строк. Этот блок кода bash выведет количество строк на экран терминала:
STDOUT (стандартный вывод)
Обычный текст без ошибок на экране вашего терминала печатается через файловый дескриптор STDOUT . STDOUT команды можно перенаправить в файл таким образом, что вывод команды записывается в файл, а не печатается на экране терминала . Это делается просто с помощью операторов >
и >>
.
Пример:
Следующая команда не будет печатать «Hello World» на экране терминала, вместо этого она создаст файл с именем file.txt
и запишет в него строку «Hello World». Это можно проверить, выполнив cat
команду над file.txt
файлом.
Однако каждый раз, когда вы несколько раз перенаправляете STDOUT любой команды в один и тот же файл, существующее содержимое файла будет удалено для записи нового.
Пример:
При запуске cat
файла file.txt
:
Вы получите только вопрос «Как дела?» напечатана строка.
Это связано с тем, что строка «Hello World» была перезаписана. Такого поведения можно избежать с помощью >>
оператора.
Приведенный выше пример можно записать так:
Запустив cat
файл file.txt
, вы получите желаемый результат.
В качестве альтернативы оператор перенаправления для STDOUT также может быть записан как 1>
. Нравиться,
STDERR (стандартная ошибка)
Текст ошибки на экране терминала выводится через STDERR команды. Например:
будет выдавать сообщения об ошибках. Это сообщение об ошибке является STDERR команды.
STDERR можно перенаправить с помощью 2>
оператора.
Эта команда перенаправит сообщение об ошибке в error.txt
файл и запишет его в него. Это можно проверить, выполнив cat
команду над error.txt
файлом.
Вы также можете использовать 2>>
оператор для STDERR так же, как вы использовали >>
для STDOUT .
Сообщения об ошибках в сценариях Bash иногда могут быть нежелательными. Вы можете игнорировать их, перенаправив сообщение об ошибке в /dev/null
файл. /dev/null
— это псевдоустройство, которое принимает текст, а затем немедленно его отбрасывает.
Приведенный выше пример можно записать следующим образом, чтобы полностью игнорировать текст ошибки:
Конечно, вы можете перенаправить как STDOUT , так и STDERR для одной и той же команды или сценария.
Оба они также могут быть перенаправлены в один и тот же файл.
Существует также более короткий способ сделать это.
Трубопроводы
До сих пор мы видели, как перенаправить STDOUT , STDIN и STDOUT в файл и из файла. Чтобы объединить выходные данные программы (команды) с входными данными другой программы (команды), вы можете использовать вертикальную черту |
.
Пример:
Эта команда выведет список файлов в текущем каталоге и передаст вывод grep
команде, которая затем отфильтрует вывод, чтобы отображать только файлы, содержащие строку «.txt».
Синтаксис:
Вы также можете создавать произвольные цепочки команд, соединяя их вместе для достижения мощного результата.
В этом примере создается список всех пользователей, которым принадлежит файл в данном каталоге, а также количество файлов и каталогов, которыми они владеют:
Выход:
HereDocument
Символ <<
можно использовать для создания временного файла [heredoc] и перенаправления из него в командной строке.
Обратите внимание, что здесь EOF
представлен разделитель (конец файла) heredoc. Фактически, мы можем использовать любое буквенно-цифровое слово вместо него для обозначения начала и конца файла. Например, это действительный документ:
По сути, это будет выглядеть так, как будто содержимое heredoc передается по конвейеру в команду. Это может сделать сценарий очень чистым, если в программу необходимо передать несколько строк.
Далее мы можем прикрепить еще трубы, как показано:
Кроме того, внутри heredocs можно использовать предопределенные переменные.
HereString
Herstrings очень похожи на heredocs, но используют файлы <<<
. Они используются для однострочных строк, которые необходимо передать в какую-либо программу. Это выглядит чище, чем heredocs, поскольку нам не нужно указывать разделитель.
Как и Heredoc, строки могут содержать переменные.
Last updated