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

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

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

Однако есть средства изменения умолчания, т.е. возможность указать другие файлы вместо стандартных. Можно также в качестве D.O. использовать S.O. Эти средства называются перенаправление (редирекция) ввода и вывода.

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

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

$ ls -l                 - вывод на экран = standard output;
$ ls -l > dirconts      - вывод в файл dirconts;
$ cat dirconts          - вывод на экран.

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

Возможна перенаправление вывода с добавлением (с дописыванием в файл): обозначается >>:

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

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

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

Пример:

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

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

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

$ 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)]
$

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

$ 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"  лю) найденных ченного
                                    записей       списка

5.6. Фильтры

Так называются команды, которые могут вводить со стандартного ввода и выводить на стандартный вывод. Большинство команд является фильтрами.

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

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

Пример:

         $ ls -l  |  tee dirconts

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

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

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

Сообщения об ошибках, возникающих при выполнении команд, выводятся на диагностический вывод, по умолчанию это (как и стандартный вывод) - на экран.

Диагностический вывод тоже может быть перенаправлен в любой файл. Для этого используется дескриптор файла (целое), который для стандартных файлов равен:

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.

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

Обычно команды выполняются в режиме переднего плана (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 - о всех процессах системы.

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), посылаемые системой задаче, можно блокировать, написав соответствующую реакцию).

Назад Содержание Вперед