Учебники

Unix / Linux — Перенаправление ввода / вывода в оболочке

В этой главе мы подробно обсудим перенаправления ввода / вывода в командной консоли. Большинство системных команд 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
$

Вы можете использовать здесь документ для печати нескольких строк, используя ваш скрипт следующим образом —

Live Demo

#!/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).