В системе UNIX некоторые команды
ожидают ввод только с клавиатуры
(стандартный ввод) и большинство
команд отображают свой вывод на
экране терминала (стандартный
вывод). Однако система UNIX позволяет
вам перенаправлять ввод и вывод в
файлы и программы, т.е. вы можете
сказать shell:
- взять ввод из файла, а не с
клавиатуры;
- послать вывод в файл, а не на
терминал;
- использовать программу как
исходные данные для другой
программы.
8.3.1. Перенаправить ввод: знак <
Чтобы перенаправить ввод, укажите
в командной строке после знака
"меньше чем" (<) имя файла:
command < имя_файла<CR>
8.3.2. Перенаправить вывод: знак >
Чтобы перенаправить вывод,
укажите в командной строке после
знака "больше чем" (>) имя
файла:
command > имя_файла<CR>
Примечание. Если вы перенаправите
вывод в уже существующий файл, то
вывод вашей команды заменит
содержимое существующего файла.
Перед тем, как перенаправить
вывод команды в конкретный файл
убедитесь, что этот файл не
существует. shell не предупреждает,
что выполняет перезапись
существующего файла.
Чтобы убедиться, что файл с
запланированным именем не
существует, воспользуйтесь
командой ls с аргументом
"имя_файла". Если этот файл не
существует, то ls выдаст сообщение,
что файл не найден в текущем
справочнике. Например, проверка
существования файлов temp и junk даст
следующий результат:
$ ls temp<CR>
temp
$ ls junk<CR>
junk: no such file or directiry
$
Это означает, что вы можете
назвать свой файл junk, но не можете
использовать в качестве имени temp,
если не хотите потерять содержимое
существующего файла.
8.3.3. Добавить вывод в
существующий файл
Чтобы добавить вывод в
существующий файл и не разрушить
его, вы можете воспользоваться
символом >>:
command >> имя_файла<CR>
В результате выполнения команды
вывод будет добавлен в конец
существующего файла. Если файл не
существует, то он будет создан.
Например, рассмотрим как добавить
вывод с помощью команды cat. Команда
cat печатает содержимое файлов,
имена которых являются ее
аргументами, в стандартный вывод.
Если нет аргументов, то она
печатает стандартный ввод в
стандартный вывод. Сначала
выполните команду cat без
перенаправления вывода. Затем
содержимое файла trial2 добавляем
после последней строки в файл trial1
при выполнении команды cat над
файлом rtial2, перенаправив вывод в
файл trial1:
$ cat trial1<CR>
This is the first line of trial1.
Hello.
This is the last line of trial1.
$
$ cat trial2<CR>
This is the beginning of trial2.
Hello.
This is the end of trial2.
$ cat trial2 >> trial1<CR>
$ cat trial1<CR>
This is the first line of trial1.
Hello.
This is the last line of trial1.
This is the beginning of trial2.
Hello.
This is the end of trial2.
$
8.3.3.1. Некоторые применения
перенаправления вывода
Перенаправление вывода очень
удобно в том случае, если вы не
хотите, чтобы вывод появлялся на
экране немедленно, или хотите
сохранить его. Рассмотрим две
команды: spell и sort.
Команда spell
Команда spell сравнивает каждое
слово в файле со своим словарем и
печатает список всех потенциальных
орфографических ошибок на экране.
Если в словаре spell нет какого-либо
слова (например, персональное имя),
то она также выдает его как
орфографическую ошибку. Если вы
подадите на ввод spell большой файл,
то его обработка займет много
времени и список ошибок может быть
очень большим. Команда spell
распечатывает весь список ошибок
сразу. Поэтому лучше всего
перенаправить вывод spell в файл.
Например, spell осуществляет поиск
файла memo и помещает список
орфографических ошибок в файл misspell:
$ spell memo > misspell<CR>
Команда sort
Команда sort размещает строки
указанного файла в алфавитном или
цифровом порядке. Прежде чем
перенаправить вывод команды в файл
убедитесь, что имя этого файла не
существует. Команда sort сначала
очищает файл, который будет
содержать вывод, затем выполняет
сортировку и помещает вывод в
пустой файл.
8.3.3.2. Комбинирование фонового
режима и перенаправления вывода
Когда команда запущена в фоновом
режиме, то вывод ее печатается на
экране терминала. И если вы
используете терминал в то же время
для выполнения других задач, то
вывод фоновой задачи будет
прерывать вашу работу. Однако, если
перенаправить вывод в файл, то вы
сможете спокойно работать.
Предположим, что вы хотите найти
все появления слова "test" в
файле schedule. Запустите команду grep в
фоновом режиме и перенаправьте
вывод в файл testfile:
$ grep test schedule > testfile<CR>
Теперь вы можете использовать
терминал для других работ и
просмотреть файл testfile позднее.
8.3.4. Перенаправление вывода
команде
Символ | называется каналом. Канал
является мощным средством, которое
позволяет вам брать вывод одной
команды и использовать его в
качестве ввода для другой команды
без создания временных файлов.
Таким образом построенная
последовательность команд
называется конвейером. Общий
формат конвейера:
command1 | command2 | command3 ... <CR>
Вывод command1 используется как ввод
для command2. Вывод command2 используется
как ввод для command3.
Чтобы понять насколько
эффективен конвейер, рассмотрим 2
способа, которые дают одинаковый
результат:
- использование метода
перенаправления ввода/вывода.
Запустим одну команду и
перенаправим ее вывод во
временный файл. Затем запустим
вторую команду, которая берет
содержимое временного файла
как ввод. И в конце удалим
временный файл;
- использование метода
конвейера. Например,
предположим вы хотите послать
сообщение happy birthday с помощью
команды banner владельцу david.
Выполним сначала по первому
методу:
- Введите команду banner и
перенаправьте ее вывод во
временный файл:
banner happy birhday > message.tmp
- Введите команду mail и в
качестве ввода
воспользуйтесь файлом
message.tmp:
mail david < message.tmp
- Удалите временный файл:
rm message.tmp
Вторым методом это можно
сделать быстрее:
banner happy birthday | mail david<CR>
8.3.5. Подстановка вывода в
качестве аргумента
Вывод большинства команд может
использоваться как аргумент в
командной строке. Для этого команду
заключите между знаками "слабое
ударение" (`...`) и поместите ее в
командной строке в том месте, где
вывод будет трактоваться как
аргумент.
Например, вы можете подставить
вывод конвейера команд date и cut в
качестве аргумента в команде banner:
$ banner `date | cut -c12-19`<CR>
Обратите внимание на результат:
система печатает banner с текущим
временем.
|