Многие команды работают по умолчанию со стандартными файлами:
Однако есть средства изменения умолчания, т.е. возможность указать другие файлы вместо стандартных. Можно также в качестве D.O. использовать S.O. Эти средства называются перенаправление (редирекция) ввода и вывода.
Используется знак >:
$ ls -l - вывод на экран = standard output; $ ls -l > dirconts - вывод в файл dirconts; $ cat dirconts - вывод на экран.
Пробелы вокруг символа > необязательны.
Возможна перенаправление вывода с добавлением (с дописыванием в файл): обозначается >>:
$ pwd >> dirconts (добавить в файл имя текущего каталога).
Используется знак <.
Пример:
$ mail - ввод сообщения с экрана; $ mail < message - ввод сообщения из файла message.
Эта возможность используется реже, чем перенаправление вывода.
Тривиальный случай перенаправления ввода:
$ cat < this_file $ cat this_file
Это две эквивалентные команды.
Можно одновременно перенаправить и ввод, и вывод.
Например:
$ cat < left > right.
Будьте осторожны: надо, чтобы left не равнялось right, иначе можно (вообще говоря) потерять входной файл.
Безопаснее >>, чем > (добавление, чем запись).
Если не задан входной файл, то будет предполагаться стандартный ввод (клавиатура). Одновременно перенаправим вывод в новый (создаваемый) файл
$cat > newfile.
Здесь стандартный ввод буферизован: накопление 512 (обычно) знаков и потом ввод.
Небуферизованный (лучше, на случай сбоев) ввод: с ключом -u (unbuffered):
$ cat -u > people Mary 101 Sally 113 Jana 121 ^d [для конца текста(EOF)] $
Можно добавлять:
$ cat -u >> people Charlie 122 Bill 100 ^d $
Стандартный вывод одной команды может быть стандартным вводом следующей команды. Обозначается знаком | (вертикальная черта).
Пример:
$ who | wc -l - создание списка активных пользователей и подсчет их числа (count); 19 - ответ, то есть 19 пользователей. $
Пример:
$ ls -l /tmp | grep maryann | sort +3nr | lpr
листинг поиск записей, сортировка печать
каталога содержащих (по 4-му по- упорядо-
/tmp строку "maryann" лю) найденных ченного
записей списка
Так называются команды, которые могут вводить со стандартного ввода и выводить на стандартный вывод. Большинство команд является фильтрами.
Есть исключения: ls не может работать со стандартным вводом. Или: lpr не может работать со стандартным выводом.
Пример:
$ ls -l | tee dirconts на экран, то есть дублирование стандартный вывод вывода в файл
Сообщения об ошибках, возникающих при выполнении команд, выводятся на диагностический вывод, по умолчанию это (как и стандартный вывод) - на экран.
Диагностический вывод тоже может быть перенаправлен в любой файл. Для этого используется дескриптор файла (целое), который для стандартных файлов равен:
| 0 | - Standard input; |
| 1 | - Standard output; |
| 2 | - Diagnostic output. |
Пример:
$ cat somefile > outfile 2> errfile,
где знак > эквивалентен 1>.
Если вы хотите, чтобы сообщения об ошибках нигде не проявлялись, направьте их на /dev/null.
Если вы хотите направить ошибки туда же, куда вывод, надо набрать
Shell: $ cat somefile 1> outfile 2> &1 (ссылка на пере- направление)
Cshell: $ cat somefile >& outfile
или $ cat somefile |& lpr.
Обычно команды выполняются в режиме переднего плана (foreground), т.е. "пока вы ждете". Однако, если во время выполнения некоторой команды вы хотите выполнять другие команды, то эту (первую) команду можно выполнить в режиме background:
$ nroff doc & 2042 $.
Об этом говорит завершающий знак &.
Система UNIX создает процесс, который выполняется независимо от командного интерпретатора. Ответ 2042 - это идентификатор этого процесса (PID).
Лучше перенаправлять стандартный вывод процесса заднего плана в файл (из-за опасности совмещения вывода "переднего" и "заднего" плана на экране).
$ nroff doc > doc.format & 2042 $
или:
$ nroff doc | lpr & 2042 $
Чтобы выяснить состояние процесса заднего плана, надо использовать команду ps (process status):
$ ps PID TTY TIME CMD 2036 02 0:05 sh (login - процесс терм.2) 2042 02 0:02 nroff doc (background) 2043 02 0:01 ps (cat pS) 2050 08 0:03 sh (login - процесс терм.8).
Это показывает, что nroff еще не закончилась. Ключи l и a в команде ps могут дать больше информации об активных процессах:
| -l | - информация о родителе, адрес, приоритет и т.д. |
| -a | - о всех процессах системы. |
1)
$ nice nroff doc > doc.fmt & 2099 $
Задается выполнение процесса с меньшим приоритетом. Начальное значение nice равно 20; параметр добавления в команде nice по умолчанию равен 10; итого nice = 30. Приоритет тем выше, чем меньше nice.
Или:
$ nice -5 nroff doc > doc.fmt &
Здесь параметр добавления задан явно, nice будет равен 25, то есть приоритет будет на 5 единиц выше, чем по умолчанию.
2) nohup (no hang up) - нечувствительность к разъединению телефонной линии, на которой "висит" standard output)
$ nohup nroff doc & 2176 $ Sending output to nohup.out (замена standard output при разрыве линии)
3) совместное использование:
$ nice nohup nroff doc > doc.fmt &
$ kill 2042 (убить процесс с PID = 2042)
или
$ kill - 9 2042
(сигнал номер 9 безусловного останова; на другие сигналы из интервала (1,15), посылаемые системой задаче, можно блокировать, написав соответствующую реакцию).