В этой главе мы подробно обсудим перенаправления ввода / вывода в командной консоли. Большинство системных команд Unix принимают данные с вашего терминала и отправляют полученные результаты обратно на ваш терминал. Команда обычно читает свой ввод со стандартного ввода, который по умолчанию является вашим терминалом. Точно так же команда обычно записывает свой вывод в стандартный вывод, который снова является вашим терминалом по умолчанию.
Перенаправление вывода
Вывод команды, обычно предназначенной для стандартного вывода, может быть легко перенаправлен в файл. Эта возможность известна как перенаправление вывода.
Если файл нотации> добавляется к какой-либо команде, которая обычно записывает свои выходные данные в стандартный вывод, выходные данные этой команды будут записаны в файл вместо вашего терминала.
Проверьте следующую команду 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 $
Перенаправление ввода
Как вывод команды может быть перенаправлен в файл, так и ввод команды может быть перенаправлен из файла. Поскольку символ «больше»> используется для перенаправления вывода, символ « меньше» < используется для перенаправления ввода команды.
Команды, которые обычно получают свой ввод от стандартного ввода, могут таким образом перенаправлять свой ввод из файла. Например, чтобы подсчитать количество строк в сгенерированном пользователем файле, вы можете выполнить команду следующим образом:
$ wc -l users 2 users $
После выполнения вы получите следующий вывод. Вы можете посчитать количество строк в файле, перенаправив стандартный ввод команды wc от пользователей файла —
$ wc -l < users 2 $
Обратите внимание, что есть разница в выводе, создаваемом двумя формами команды wc. В первом случае имя пользователя файла указывается с количеством строк; во втором случае это не так.
В первом случае wc знает, что он читает свои данные от пользователей файла. Во втором случае он только знает, что он читает свои входные данные из стандартного ввода, поэтому он не отображает имя файла.
Вот документ
Здесь документ используется для перенаправления ввода в интерактивный сценарий оболочки или программу.
Мы можем запустить интерактивную программу в сценарии оболочки без действий пользователя, предоставив необходимые данные для интерактивной программы или сценария интерактивной оболочки.
Общая форма документа здесь —
command << delimiter document delimiter
Здесь оболочка интерпретирует оператор << как инструкцию для чтения ввода, пока не найдет строку, содержащую указанный разделитель. Все входные строки вплоть до строки, содержащей разделитель, затем подаются на стандартный ввод команды.
Разделитель сообщает оболочке, что документ здесь завершен. Без этого оболочка продолжает читать ввод навсегда. Разделителем должно быть одно слово, которое не содержит пробелов или табуляций.
Ниже приведен ввод команды wc -l для подсчета общего количества строк:
$wc -l << EOF This is a simple lookup program for good (and bad) restaurants in Cape Town. EOF 3 $
Вы можете использовать здесь документ для печати нескольких строк, используя ваш скрипт следующим образом —
#!/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> файл Вывод pgm перенаправляется в файл |
2 |
ПГМ <файл Программа ПГМ читает свой ввод из файла |
3 |
pgm >> файл Вывод pgm добавляется в файл |
4 |
n> файл Вывод из потока с дескриптором n, перенаправленным в файл |
5 |
n >> file Вывод из потока с добавленным в файл дескриптором n |
6 |
n> & m Объединяет вывод из потока n с потоком m |
7 |
n <& m Объединяет входные данные из потока n с потоком m |
8 |
<< тег Стандартный ввод идет отсюда через следующий тег в начале строки |
9 |
| Получает вывод из одной программы или процесса и отправляет его другой |
pgm> файл
Вывод pgm перенаправляется в файл
ПГМ <файл
Программа ПГМ читает свой ввод из файла
pgm >> файл
Вывод pgm добавляется в файл
n> файл
Вывод из потока с дескриптором n, перенаправленным в файл
n >> file
Вывод из потока с добавленным в файл дескриптором n
n> & m
Объединяет вывод из потока n с потоком m
n <& m
Объединяет входные данные из потока n с потоком m
<< тег
Стандартный ввод идет отсюда через следующий тег в начале строки
|
Получает вывод из одной программы или процесса и отправляет его другой
Обратите внимание, что файловый дескриптор 0 обычно является стандартным вводом (STDIN), 1 — стандартным выводом (STDOUT), а 2 — стандартным выводом ошибок (STDERR).