5. КОМАНДЫ И СТАНДАРТНЫЕ ФАЙЛЫ

5.1. Стандартные файлы

Многие команды работают по умолчанию со стандартными

файлами:

 

 

- 20 -

- Standard Input (S.I.);

- Standard Output (S.O.);

- Diagnostic Output (D.O.);

Однако есть средства изменения умолчания, т.е. возмож-

ность указать другие файлы вместо стандартных. Можно

также в качестве D.O. использовать S.O. Эти средства называ-

ются перенаправление (редирекция) ввода и вывода.

 

5.2. Перенаправление стандартного вывода

Используется знак >:

$ ls -l - вывод на экран = standard output;

$ ls -l > dirconts - вывод в файл dirconts;

$ cat dirconts - вывод на экран.

Пробелы вокруг символа > необязательны.

Возможна перенаправление вывода с добавлением (с дописы-

ванием в файл): обозначается >>:

$ pwd >> dirconts (добавить в файл имя текущего каталога).

 

5.3. Перенаправление стандартного ввода

Используется знак <.

Пример:

$ mail - ввод сообщения с экрана;

$ mail < message - ввод сообщения из файла message.

Эта возможность используется реже, чем перенаправление вывода.

Тривиальный случай перенаправления ввода:

 

 

- 21 -

$ cat < this_file

$ cat this_file

Это две эквивалентные команды.

Можно одновременно перенаправить и ввод, и вывод.

Например:

$ cat < left > right.

Будьте осторожны: надо, чтобы left не равнялось right,

иначе можно (вообще говоря) потерять входной файл.

Безопаснее >>, чем > (добавление, чем запись).

 

5.4. Создание файла командой cat

Если не задан входной файл, то будет предполагаться стан-

дартный ввод (клавиатура). Одновременно перенаправим вывод в

новый (создаваемый) файл

$cat > newfile.

Здесь стандартный ввод буферизован: накопление 512 (обыч-

но) знаков и потом ввод.

Небуферизованный (лучше, на случай сбоев) ввод:

с ключом -u (unbuffered):

$ cat -u > people

Mary 101

Sally 113

Jana 121

^d [для конца текста(EOF)]

$

 

 

- 22 -

Можно добавлять:

$ cat -u >> people

Charlie 122

Bill 100

^d

$

 

5.5. Соединение команд каналами (pipeline)

Стандартный вывод одной команды может быть стандартным

вводом следующей команды. Обозначается знаком | (вертикаль-

ная черта).

Пример:

$ who | wc -l - создание списка активных пользователей и

подсчет их числа (count); 19 - ответ, то есть 19 пользовате-

лей.

$

Пример:

   $ ls -l /tmp | grep maryann | sort +3nr | lpr
листинг          поиск записей,    сортировка    печать
каталога         содержащих        (по 4-му по-  упорядо-
 /tmp            строку "maryann"  лю) найденных ченного
                                    записей       списка

 

 

 

- 23 -

5.6. Фильтры

Так называются команды, которые могут вводить со стан-

дартного ввода и выводить на стандартный вывод. Большинство

команд является фильтрами.

Есть исключения: ls не может работать со стандартным вво-

дом. Или: lpr не может работать со стандартным выводом.

 

5.7. Параллельный стандартный вывод и перенаправление вывода

                                         -------------------
                                     --->│cтандартный вывод│
              ---------  ---------   │   -------------------
Схема такова: │ вывод │->│команда│-->│
              │       │  │  tee  │   │          ------
              ---------  ---------   ---------->│файл│
                                                ------

Пример:

$ ls -l | tee dirconts

на экран, то есть дублирование

стандартный вывод вывода в файл

 

5.8. Диагностический вывод

Сообщения об ошибках, возникающих при выполнении команд,

выводятся на диагностический вывод, по умолчанию это (как и

стандартный вывод) - на экран.

Диагностический вывод тоже может быть перенаправлен в лю-

бой файл. Для этого используется дескриптор файла (целое),

который для стандартных файлов равен:

 

 

- 24 -

0 - Standard input;

1 - Stfndard 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.

 

5.9. Обработка команд в режиме заднего плана (background)

 

Обычно команды выполняются в режиме переднего плана

(foreground), т.е. "пока вы ждете". Однако, если во время

выполнения некоторой команды вы хотите выполнять другие ко-

манды, то эту (первую) команду можно выполнить в режиме

background:

$ nroff doc &

2042

$.

Об этом говорит завершающий знак &.

 

 

- 25 -

Система 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 - о всех процессах системы.

 

 

- 26 -

5.10. Выполнение процессов с низким приоритетом

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 &

 

5.11. Останов процесса

$ kill 2042 (убить процесс с PID = 2042)

или

$ kill - 9 2042 (сигнал номер 9 безусловного останова; на

другие сигналы из интервала (1,15), посылаемые системой за-

даче, можно блокировать, написав соответствующую реакцию).