Unix / Linux - Перенаправление ввода / вывода оболочки
В этой главе мы подробно обсудим перенаправления ввода / вывода Shell. Большинство системных команд Unix принимают входные данные с вашего терминала и отправляют полученные выходные данные обратно на ваш терминал. Команда обычно считывает свой ввод со стандартного ввода, который по умолчанию является вашим терминалом. Точно так же команда обычно записывает свой вывод в стандартный вывод, который снова является вашим терминалом по умолчанию.
Перенаправление вывода
Вместо этого вывод команды, обычно предназначенной для стандартного вывода, можно легко перенаправить в файл. Эта возможность известна как перенаправление вывода.
Если нотация> file добавляется к любой команде, которая обычно записывает свой вывод в стандартный вывод, вывод этой команды будет записан в файл вместо вашего терминала.
Проверьте следующее who команда, которая перенаправляет полный вывод команды в файл пользователя.
$ who > users
Обратите внимание, что на терминале нет вывода. Это связано с тем, что вывод был перенаправлен со стандартного устройства вывода по умолчанию (терминала) в указанный файл. Вы можете проверить файл пользователей на предмет полного содержания -
$ cat users
oko tty01 Sep 12 07:30
ai tty15 Sep 12 13:32
ruth tty21 Sep 12 10:10
pat tty24 Sep 12 13:07
steve tty25 Sep 12 13:03
$
Если вывод команды перенаправлен в файл, а файл уже содержит некоторые данные, эти данные будут потеряны. Рассмотрим следующий пример -
$ echo line 1 > users
$ cat users
line 1
$
Вы можете использовать оператор >>, чтобы добавить вывод в существующий файл следующим образом:
$ echo line 2 >> users
$ cat users
line 1
line 2
$
Перенаправление ввода
Как вывод команды может быть перенаправлен в файл, так и ввод команды может быть перенаправлен из файла. Посколькуgreater-than character > используется для перенаправления вывода, less-than character < используется для перенаправления ввода команды.
Для команд, которые обычно вводятся со стандартного ввода, можно таким образом перенаправить ввод из файла. Например, чтобы подсчитать количество строк в файле, созданном пользователями выше, вы можете выполнить команду следующим образом:
$ wc -l users
2 users
$
После выполнения вы получите следующий результат. Вы можете подсчитать количество строк в файле, перенаправив стандартный вводwcкоманда из файла users -
$ wc -l < users
2
$
Обратите внимание, что существует разница в выводе, производимом двумя формами команды wc. В первом случае имена пользователей файла указываются вместе с количеством строк; во втором случае это не так.
В первом случае wc знает, что считывает ввод от пользователей файла. Во втором случае он знает только, что считывает ввод со стандартного ввода, поэтому он не отображает имя файла.
Здесь документ
А here document используется для перенаправления ввода в сценарий или программу интерактивной оболочки.
Мы можем запустить интерактивную программу в сценарии оболочки без действий пользователя, предоставив необходимые входные данные для интерактивной программы или интерактивного сценария оболочки.
Общий вид для here документ -
command << delimiter
document
delimiter
Здесь оболочка интерпретирует <<как инструкцию для чтения ввода до тех пор, пока он не найдет строку, содержащую указанный разделитель. Все строки ввода до строки, содержащей разделитель, затем подаются на стандартный ввод команды.
Разделитель сообщает оболочке, что hereдокумент завершен. Без него оболочка продолжает читать ввод вечно. Разделитель должен быть одним словом, не содержащим пробелов и табуляции.
Ниже приведен ввод команды wc -l для подсчета общего количества строк -
$wc -l << EOF
This is a simple lookup program
for good (and bad) restaurants
in Cape Town.
EOF
3
$
Вы можете использовать here document для печати нескольких строк с помощью вашего скрипта следующим образом -
#!/bin/sh
cat << EOF
This is a simple lookup program
for good (and bad) restaurants
in Cape Town.
EOF
После выполнения вы получите следующий результат -
This is a simple lookup program
for good (and bad) restaurants
in Cape Town.
Следующий сценарий запускает сеанс с vi текстовый редактор и сохраняет ввод в файл test.txt.
#!/bin/sh
filename=test.txt
vi $filename <<EndOfCommands
i
This file was created automatically from
a shell script
^[
ZZ
EndOfCommands
Если вы запустите этот скрипт с vim, действующим как vi, вы, вероятно, увидите следующий результат:
$ sh test.sh
Vim: Warning: Input is not from a terminal
$
После запуска скрипта вы должны увидеть следующее, добавленное в файл test.txt -
$ cat test.txt
This file was created automatically from
a shell script
$
Отменить вывод
Иногда вам нужно выполнить команду, но вы не хотите, чтобы вывод отображался на экране. В таких случаях вы можете отказаться от вывода, перенаправив его в файл/dev/null -
$ command > /dev/null
Здесь команда - это имя команды, которую вы хотите выполнить. Файл/dev/null это специальный файл, который автоматически отбрасывает все введенные данные.
Чтобы отклонить как вывод команды, так и вывод ошибки, используйте стандартное перенаправление для перенаправления STDERR к STDOUT -
$ command > /dev/null 2>&1
Вот 2 представляет собой STDERR и 1 представляет собой STDOUT. Вы можете отобразить сообщение в STDERR, перенаправив STDOUT в STDERR следующим образом:
$ echo message 1>&2
Команды перенаправления
Ниже приведен полный список команд, которые вы можете использовать для перенаправления.
Sr.No. | Команда и описание |
---|---|
1 | pgm > file Вывод pgm перенаправляется в файл |
2 | pgm < file Программа pgm считывает ввод из файла |
3 | pgm >> file Вывод pgm добавляется в файл |
4 | n > file Вывод из потока с дескриптором n перенаправлен в файл |
5 | n >> file Вывод из потока с дескриптором n добавлено к файлу |
6 | n >& m Объединяет вывод из потока n с потоком m |
7 | n <& m Объединяет ввод из потока n с потоком m |
8 | << tag Стандартный ввод идет отсюда через следующий тег в начале строки |
9 | | Получает вывод из одной программы или процесса и отправляет его другой |
Обратите внимание, что дескриптор файла 0 обычно стандартный ввод (STDIN), 1 стандартный вывод (STDOUT), и 2 стандартный вывод ошибок (STDERR).