STDIN

10.3.4 STDIN

Концепция перенаправления STDIN сложна, потому что труднее понять, почему вы хотите перенаправить STDIN. С STDOUT и STDERR их цель проста; иногда бывает полезно сохранить вывод в файл для использования в будущем.

Большинство пользователей Linux регулярно перенаправляют STDOUT, иногда STDERR и очень редко STDIN.

Существует очень мало команд, требующих перенаправления STDIN, потому что в большинстве команд, если вы хотите прочитать данные из файла в команду, вы можете указать имя файла в качестве аргумента команды.

Для некоторых команд, если вы не укажете имя файла в качестве аргумента, они возвращаются к использованию STDIN для получения данных. Например, рассмотрим следующую catкоманду:

sysadmin@localhost:~$ cat
hello
hello‌⁠​​⁠​ 
how are you?
how are you?
goodbye
goodbye

В предыдущем примере catкоманде не передается имя файла в качестве аргумента. Итак, он запрашивает данные для отображения на экране из STDIN. Пользователь вводит hello, а затем catкоманда отображается helloна экране. Хотя это слегка развлекает, это не особенно полезно.

Однако, если бы вывод команды catбыл перенаправлен в файл, то этот метод можно было бы использовать либо для добавления текста в существующий файл, либо для помещения текста в новый файл.

Первая команда в приведенном ниже примере перенаправляет вывод команды catво вновь созданный файл с именем new.txt. За этим действием следует предоставление catкоманде файла new.txtв качестве аргумента для отображения перенаправленного текста в STDOUT.

sysadmin@localhost:~$ cat > new.txt
Hello
How are you?
Goodbye
sysadmin@localhost:~$ cat new.txt                               
Hello
How are you?
Goodbye

Хотя предыдущий пример демонстрирует еще одно преимущество перенаправления STDOUT, он не объясняет, почему и как может быть перенаправлен STDIN. Чтобы понять это, рассмотрим новую команду под названием tr. Эта команда берет набор символов и переводит их в другой набор символов.

Например, чтобы сделать строку текста заглавной, используйте trследующую команду:

sysadmin@localhost:~$ tr 'a-z' 'A-Z'
watch how this works
WATCH HOW THIS WORKS

Команда trвзяла STDIN с клавиатуры и преобразовала все строчные буквы перед отправкой STDOUT на экран.

Казалось бы, лучше использовать эту trкоманду для выполнения перевода файла, а не ввода с клавиатуры. Однако trкоманда не поддерживает аргументы имени файла:

sysadmin@localhost:~$ cat example.txt
/etc/ppp:
ip-down.d
ip-up.d
sysadmin@localhost:~$ tr 'a-z' 'A-Z' example.txt
tr: extra operand `example.txt'
Try `tr --help' for more information

Однако можно указать оболочке получать STDIN из файла, а не с клавиатуры, используя символ <:

sysadmin@localhost:~$ tr 'a-z' 'A-Z' < example.txt
/ETC/PPP:
IP-DOWN.D
IP-UP.D

Большинство команд принимают имена файлов в качестве аргументов, поэтому такой вариант использования встречается относительно редко. Однако для тех, кто этого не делает, этот метод можно использовать для чтения оболочки из файла вместо того, чтобы полагаться на команду, чтобы иметь эту возможность.

Последнее замечание, чтобы сохранить полученный результат, перенаправить его в другой файл:

sysadmin@localhost:~$ tr 'a-z' 'A-Z' < example.txt > newexample.txt
sysadmin@localhost:~$ cat newexample.txt
/ETC/PPP:
IP-DOWN.D
IP-UP.D

Last updated