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