- Перенаправление ввода-вывода
- STDIN
- STDOUT
- STDERR
- Перенаправление вывода в скриптах
- Временное перенаправление вывода
- Постоянное перенаправление вывода
- Перенаправление ввода в скриптах
- Подавление вывода
- Перенаправление ввода-вывода в Linux
- Потоки ввода-вывода
- Стандартный ввод
- Стандартный вывод
- Стандартная ошибка
- Перенаправление потоков
- Конвейеры
- Фильтры
- Примеры перенаправления ввода-вывода
- команда > файл
- команда > /dev/null
- команда 2 > файл
- команда >> файл
- команда 2>>файл
- команда | команда
- команда | tee файл
- команда | команда | команда >> файл
- Заключение
- Как я могу подавить весь вывод команды, используя Bash?
Перенаправление ввода-вывода
Всё в Linux — это файлы, в том числе — ввод и вывод. Операционная система идентифицирует файлы с использованием дескрипторов. Каждому процессу позволено иметь до девяти открытых дескрипторов файлов. Оболочка bash резервирует первые три дескриптора с идентификаторами 0, 1 и 2. Вот что они означают.
- 0, STDIN — стандартный поток ввода
- 1, STDOUT — стандартный поток вывода
- 2, STDERR — стандартный поток ошибок
STDIN
STDIN — это стандартный поток ввода оболочки. Для терминала стандартный ввод — это клавиатура. Когда используется символ перенаправления ввода — , Linux заменяет дескриптор файла стандартного ввода на тот, который указан в команде. Система читает файл и обрабатывает данные так, будто они введены с клавиатуры.
Многие команды bash принимают ввод из STDIN , если в командной строке не указан файл, из которого надо брать данные. Например, это справедливо для команды cat .
Когда вы вводите команду cat в командной строке, не задавая параметров, она принимает ввод из STDIN . После того, как вы вводите очередную строку, cat просто выводит её на экран. И останавливается после того как получает EOF . EOF вводится нажатием сочетания клавиш Ctrl+D.
STDOUT
STDOUT — стандартный поток вывода оболочки. По умолчанию это — экран. Большинство bash-команд выводят данные в STDOUT , что приводит к их появлению в консоли. Данные можно перенаправить в файл, для этого используется символ перенаправления вывода > .
Можно осуществить перенаправление вывода в файл с добавлением в конец с помощью >> . При этом информация, хранящаяся в файле не будет удалена, а вся новая информация будет добавлена в конец этого файла.
STDERR
STDERR представляет собой стандартный поток ошибок оболочки. По умолчанию этот дескриптор указывает на то же самое, на что указывает STDOUT , именно поэтому при возникновении ошибки мы видим сообщение на экране.
Рассмотрим простой пример — нужно записать в файл data.txt содержимое директории data . Если директория не существует, сообщение об ошибке надо записать в файл error.txt . Чтобы этого добиться, нужно использовать команды перенаправления для соответствующих дескрипторов с указанием файлов, куда должны попадать ошибки и стандартный вывод:
Если надо, STDERR и STDOUT можно перенаправить в один и тот же файл, воспользовавшись &> :
Устаревшая форма записи:
Оболочка определяет порядок перенаправления потоков в командной строке слева направо, поэтому приведенный выше пример нельзя записать так:
В этом случае сначала вывод ошибок перенаправляется в стандартный вывод (на экран), а потом стандартный вывод перенаправляется в файл data-error.txt . То есть, ошибки будут выведены в консоль, а данные — в файл.
Для дозаписи в файл data-error.txt
Перенаправление вывода в скриптах
Существует два метода перенаправления вывода в сценариях командной строки:
- Временное перенаправление, или перенаправление вывода одной строки
- Постоянное перенаправление, или перенаправление всего вывода сценария
Временное перенаправление вывода
В сценарии можно перенаправить вывод отдельной строки в STDERR . Чтобы это сделать, достаточно использовать команду перенаправления, указав дескриптор STDERR , при этом перед номером дескриптора надо поставить символ амперсанда:
Если запустить этот скрипт, обе строки попадут на экран, так как, как вы уже знаете, по умолчанию ошибки выводятся туда же, куда и обычные данные.
Запустим скрипт так, чтобы вывод STDERR попадал в файл:
Теперь обычный вывод делается в консоль, а сообщения об ошибках попадают в файл error.txt .
Постоянное перенаправление вывода
Если в скрипте нужно перенаправлять много выводимых на экран данных, добавлять >&2 к каждому вызову echo неудобно. Вместо этого можно задать перенаправление вывода в определённый дескриптор на время выполнения скрипта, воспользовавшись командой exec :
После запуска сценария весь вывод будет перенаправлен в файл output.txt .
Команду exec можно использовать не только в начале скрипта, но и в других местах:
Перенаправление ввода в скриптах
Для перенаправления ввода можно воспользоваться тем же способом, который использовался для перенаправления вывода. Например, команда exec позволяет сделать источником данных для STDIN какой-нибудь файл:
Эта команда указывает оболочке на то, что источником вводимых данных должен стать файл data.txt , а не обычный STDIN . Посмотрим на перенаправление ввода в действии:
Подавление вывода
Иногда надо сделать так, чтобы команды в скрипте, который, например, может исполняться как фоновый процесс, ничего не выводили на экран. Для этого можно перенаправить вывод в /dev/null .
Вот, например, как подавить вывод сообщений об ошибках:
Тот же подход используется, если, например, надо очистить файл, не удаляя его:
Источник
Перенаправление ввода-вывода в Linux
Встроенные возможности перенаправления в Linux предоставляют вам широкий набор инструментов, используемых упрощения для всех видов задач. Умение управлять различными потоками ввода-вывода в значительно увеличит производительность, как при разработке сложного программного обеспечения, так и при управлении файлами с помощью командной строки.
Потоки ввода-вывода
Ввод и вывод в окружении Linux распределяется между тремя потоками:
- Стандартный ввод (standard input, stdin, поток номер 0)
- Стандартный вывод (standard output, stdout, номер 1)
- Стандартная ошибка, или поток диагностики (standard error, stderr, номер 2)
При взаимодействии пользователя с терминалом стандартный ввод передается через клавиатуру пользователя. Стандартный вывод и стандартная ошибка отображаются на терминале пользователя в виде текста. Все эти три потока называются стандартными потоками.
Стандартный ввод
Стандартный входной поток обычно передаёт данные от пользователя к программе. Программы, которые предполагают стандартный ввод, обычно получают входные данные от устройства (например, клавиатуры). Стандартный ввод прекращается по достижении EOF (end-of-file, конец файла). EOF указывает на то, что больше данных для чтения нет.
Чтобы увидеть, как работает стандартный ввод, запустите программу cat. Название этого инструмента означает «concatenate» (связать или объединить что-либо). Обычно этот инструмент используется для объединения содержимого двух файлов. При запуске без аргументов cat открывает командную строку и принимает содержание стандартного ввода.
Теперь введите несколько цифр:
Вводя цифру и нажимая enter, вы отправляете стандартный ввод запущенной программе cat, которая принимает эти данные. В свою очередь, программа cat отображает полученный ввод в стандартном выводе.
Пользователь может задать EOF, нажав ctrl-d, после чего программа cat остановится.
Стандартный вывод
Стандартный вывод записывает данные, сгенерированные программой. Если стандартный выходной поток не был перенаправлен, он выведет текст в терминал. Попробуйте запустить следующую команду для примера:
echo Sent to the terminal through standard output
Команда echo без дополнительных опций отображает на экране все аргументы, переданные ей в командной строке.
Теперь запустите echo без аргументов:
Команда вернёт пустую строку.
Стандартная ошибка
Этот стандартный поток записывает ошибки, создаваемые программой, которая вышла из строя. Как и стандартный вывод, этот поток отправляет данные в терминал.
Рассмотрим пример потока ошибок команды ls. Команда ls отображает содержимое каталогов.
Без аргументов эта команда возвращает содержимое текущего каталога. Если указать в качестве аргумента ls имя каталога, команда вернёт его содержимое.
Поскольку каталога % не существует, команда вернёт стандартную ошибку:
ls: cannot access %: No such file or directory
Перенаправление потоков
Linux предоставляет специальные команды для перенаправления каждого потока. Эти команды записывают стандартный вывод в файл. Если вывод перенаправлен в несуществующий файл, команда создаст новый файл с таким именем и сохранит в него перенаправленный вывод.
Команды с одной угловой скобкой переписывают существующий контент целевого файла:
- > – стандартный вывод
- – стандартная ошибка
Команды с двойными угловыми скобками не переписывают содержимое целевого файла:
- >> – стандартный вывод
- > – стандартная ошибка
Рассмотрим следующий пример:
cat > write_to_me.txt
a
b
c
ctrl-d
В данном примере команда cat используется для записи выходных данных в файл.
Просмотрите содержимое write_to_me.txt:
Команда должна вернуть:
Снова перенаправьте cat в файл write_to_me.txt и введите три цифры.
cat > write_to_me.txt
1
2
3
ctrl-d
Теперь проверьте содержимое файла.
Команда должна вернуть:
Как видите, файл содержит только последние выходные данные, поскольку в команде, перенаправляющей выход, использовалась одна угловая скобка.
Теперь попробуйте запустить ту же команду с двумя угловыми скобками:
cat >> write_to_me.txt
a
b
c
ctrl-d
Команды с двойными угловыми скобками не перезаписывают существующий контент, а дополняют его.
Конвейеры
Конвейеры (pipes) перенаправляют потоки вывода одной команды на вход другой. При этом данные, передаваемые второй программе, не отображаются в терминале. На экране данные появятся только после обработки второй программой.
Конвейеры в Linux представлены вертикальной чертой.
Такая команда передаст вывод ls (содержимое текущего каталога) программе less, которая отображает передаваемые ей данные построчно. Как правило, ls выводит содержимое каталогов подряд, не разбивая на строки. Если перенаправить вывод ls в less, то последняя команда разделит вывод на строки.
Как видите, конвейер может перенаправить вывод одной команды на вход другой, в отличие от > и >>, которые перенаправляют данные только в файлы.
Фильтры
Фильтры – это команды, которые могут изменить перенаправление и вывод конвейера.
Примечание: Фильтры также являются стандартными командами Linux, которые можно использовать и без конвейера.
- find – выполняет поиск файла по имени.
- grep – выполняет поиск текста по заданному шаблону.
- tee – перенаправляет стандартный ввод в стандартный вывод и один или несколько файлов.
- tr – поиск и замена строк.
- wc – подсчёт символов, строк и слов.
Примеры перенаправления ввода-вывода
Теперь, когда вы ознакомились с основными понятиями и механизмами перенаправления, рассмотрим несколько базовых примеров их использования.
команда > файл
Такой шаблон перенаправляет стандартный вывод команды в файл.
Эта команда передает содержимое root каталога системы в качестве стандартного вывода и записывает вывод в файл root_dir_contents. Это удалит все предыдущее содержимое в файле, так как в команде использована одна угловая скобка.
команда > /dev/null
/dev/null – это специальный файл (так называемое «пустое устройство»), который используется для подавления стандартного потока вывода или диагностики, чтобы избежать нежелательного вывода в консоль. Все данные, попадающие в /dev/null, сбрасываются. Перенаправление в /dev/null обычно используется в сценариях оболочки.
Такая команда сбрасывает стандартный выходной поток, возвращаемый командой ls, передав его в /dev/null.
команда 2 > файл
Этот шаблон перенаправляет стандартный поток ошибок команды в файл, перезаписывая его текущее содержимое.
mkdir » 2> mkdir_log.txt
Эта команда перенаправит ошибку, вызванную неверным именем каталога, и запишет её в log.txt. Обратите внимание: ошибка по-прежнему отображается в терминале.
команда >> файл
Этот шаблон перенаправляет стандартный выход команды в файл, не переписывая текущего содержимого файла.
echo Written to a new file > data.txt
echo Appended to an existing file’s contents >> data.txt
Эта пара команд сначала перенаправляет вводимый пользователем текст в новый файл, а затем вставляет его в существующий файл, не переписывая его содержимого.
команда 2>>файл
Этот шаблон перенаправляет стандартный поток ошибок команды в файл, не перезаписывая существующего содержимого файла. Он подходит для создания логов ошибок программы или сервиса, поскольку содержимое лога не будет постоянно обновляться.
find » 2> stderr_log.txt
wc » 2>> stderr_log.txt
Приведенная выше команда перенаправляет сообщение об ошибке, вызванное неверным аргументом find, в файл stderr_log.txt, а затем добавляет в него сообщение об ошибке, вызванной недействительным аргументом wc.
команда | команда
Этот шаблон перенаправляет стандартный выход первой команды на стандартный вход второй команды.
find /var lib | grep deb
Эта команда ищет в каталоге /var и его подкаталогах имена файлов и расширения deb и возвращает пути к файлам, выделяя шаблон поиска красным цветом.
команда | tee файл
Такой шаблон перенаправляет стандартный вывод команды в файл и переписывает его содержимое, а затем отображает перенаправленный выход в терминале. Если указанного файла не существует, он создает новый файл.
В данном шаблоне команда tee, как правило, используется для просмотра вывода программы и одновременного сохранения его в файл.
wc /etc/magic | tee magic_count.txt
Такая команда передаёт количество символов, строк и слов в файле magic (Linux использует его для определения типов файлов) команде tee, которая отправляет эти данные в терминал и в файл magic_count.txt.
команда | команда | команда >> файл
Этот шаблон перенаправляет стандартный вывод первой команды и фильтрует ее через следующие две команды, а затем добавляет окончательный результат в файл.
| grep *tar | tr e E >> ls_log.txt
Такая команда отправляет вывод ls для каталога root команде grep. В свою очередь, grep ищет в полученных данных файлы tar. После этого результат grep передаётся команде tr, которая заменит все символы е символом Е. Полученный результат будет добавлен в файл ls_log.txt (если такого файла не существует, команда создаст его автоматически).
Заключение
Функции перенаправления ввода-вывода в Linux сначала кажутся слишком сложными. Однако работа с перенаправлением – один из важнейших навыков системного администратора.
Чтобы узнать больше о какой-либо команде, используйте:
man command | less
Такая команда вернёт полный список команд для tee.
Источник
Как я могу подавить весь вывод команды, используя Bash?
У меня есть скрипт Bash, который запускает программу с параметрами. Эта программа выводит некоторый статус (делает это, делает это . ). Эта программа не может быть тихой. Как я могу предотвратить отображение сценарием чего-либо?
Я ищу что-то похожее на Windows » echo off» .
Следующее посылает стандартный вывод на нулевое устройство (битовая корзина).
И если вы также хотите, чтобы сообщения об ошибках отправлялись туда, используйте одно из (первое может работать не во всех оболочках):
И, если вы хотите записать сообщения, но не видите их, замените /dev/null их реальным файлом, таким как:
Для полноты, в Windows cmd.exe (где «nul» является эквивалентом «/ dev / null»), это:
Это предотвратит стандартный вывод и вывод ошибок, перенаправляя их обоих /dev/null .
: это сокращение от «ничего не делать».
$() это просто ваша команда.
Альтернативой, которая может подходить в некоторых ситуациях, является присвоение результата команды переменной:
Поскольку Bash и другие интерпретаторы командной строки POSIX не рассматривают присвоение переменных как команду, код возврата настоящей команды соблюдается.
Примечание: присвоение с ключевым словом typeset or declare рассматривается как команда, поэтому в качестве оценочного кода возврата в данном случае используется само присвоение, а не команда, выполняемая в вложенной оболочке:
Как и в посте andynormancx , используйте это (если вы работаете в среде Unix):
Или вы можете использовать это (если вы работаете в среде Windows):
Источник