2.2. Группировка команд.
Средства группировки:
; и <перевод строки> - определяют последовательное выполнение команд;
& - асинхронное (фоновое) выполнение предшествующей команды;
&& - выполнение последующей команды при условии нормального завершения
предыдущей, иначе игнорировать;
- выполнение последующей команды при ненормальном завершении предыдущей, иначе
игнорировать.
При выполнении команды в асинхронном режиме (после команды стоит один амперсанд)
на экран выводится номер процесса, соответствующий выполняемой команде, и
система, запустив этот фоновый процесс, вновь выходит на диалог с пользователем.
Например, наберем команду "find" в фоновом режиме для поиска в системе , начиная
от корня "/", файла с именем "conf", а затем "pwd" в обычном режиме. На экране
этот фрагмент будет выглядеть следующим образом (курсивом выделены комментарии):
$ find/-name conf -print & ввод команды "find"
288 номер (PID) фонового процесса
$ pwd ввод команды "pwd"
/mnt/lab/asu результат работы "pwd"
$ возвращение shell в промптер
/usr/include/sys/conf результат работы "find"
Иногда необходимо, чтобы все фоновые процессы завершились, прежде чем будет
выполняться какой-то расчет. Для этого служит специальная команда "wait [PID]".
Эта команда ждет завершения указанного идентификатором (числом) фонового
процесса. Если команда без параметра, то она ждет завершения всех фоновых
процессов, дочерних для данного "sh".
Для группировки команд также могут использоваться фигурные "{}" и круглые "()"
скобки. Рассмотрим примеры, сочетающие различные способы группировки: Если
введена командная строка
command1 && command2; command3
где command1, command2 и command3 - какие-то команды, то "command2" будет
выполнена только при успешном завершении "command1"; после любого из исходов
обработки "command2" (т.е. "command2" будет выполнена, либо пропущена) будет
выполнена "command3".
command1 && { command2; command3}
Здесь обе команды ("command2" и "command3") будут выполнены только при успешном
завершении "command1".
{command1; command2} &
В фоновом режиме будет выполняться последовательность команд "command1" и
"command2".
Фоновые процессы сложно уничтожить, поскольку традиционная команда "CTL/C"
прерывает только процессы переднего плана. Для уничтожения фонового процесса
надо знать его номер. При запуске фонового процесса на экран выдается число,
соответствующее номеру (идентификатору) этого процесса (PID). Если этот номер
забыт или надо убедиться, что этот процесс не закончен, с помощью команды
ps -aux
можно получить перечень идентификаторов процессов (PID), имена пользователей,
текущее время, затраченное процессами, и т.д.
В выведенной таблице можно найти номера процессов, подлежащих уничтожению,
например это "849" и "866". Тогда командой
kill -9 866 849
можно уничтожить эти процессы. При уничтожении процессов надо вы должны иметь то
же имя пользователя, какое было приписано уничтожаемым процессам или root.
Круглые скобки "()", кроме выполнения функции группировки, выполняют и функцию
вызова нового экземпляра интерпретатора shell.
Пусть мы находились в начальном каталоге "/mnt/lab/asu"
Тогда в последовательности команд
cd ..; ls; ls
две команды "ls" выдадут 2 экземпляра содержимого каталога "/mnt/lab", а
последовательность
(cd ..; ls) ls
выдаст сначала содержимое каталога "/mnt/lab", а затем содержимое
"/mnt/lab/asu", т.к. при входе в скобки вызывается новый экземпляр shell, в
рамках которого и осуществляется переход. При выходе из круглых скобок
происходит возврат в старый shell и в старый каталог.
2.3. Перенаправление команд
Стандартный ввод (вход) - "stdin" в ОС UNIX осуществляется с клавиатуры
терминала, а стандартный вывод (выход) - "stdout" направлен на экран терминала.
Существует еще и стандартный файл диагностических сообщений - "stderr", о
котором речь будет чуть позже.
Команда, которая может работать со стандартным входом и выходом, называется
ФИЛЬТРОМ.
Пользователь имеет удобные средства перенаправления ввода и вывода на другие
файлы (устройства). Символы ">" и ">>" обозначают перенаправление вывода.
ls >file_1
команда "ls" сформирует список файлов текущего каталога и поместит его в файл
"file_1" (вместо выдачи на экран). Если файл "file_1" до этого существовал, то
он будет затерт новым.
pwd >>file_1
команда pwd сформирует полное имя текущего каталога и поместит его в конец файла
"file_1", т.е. ">>" добавляет в файл, если он непустой.
Символы "<" и "<<" обозначают перенаправление ввода.
wc -l <file_1
подсчитает и выдаст на экран число строк в файле file_1.
ed file_2 <<!
создаст с использованием редактора файл "file_2", непосредственно с терминала.
Окончание ввода определяется по символу, стоящему правее "<<" (т. е. "!"). То
есть ввод будет закончен, когда первым в очередной строке будет "!".
Можно сочетать перенаправления. Так
wc -l <file_3 >file_4
и
wc -l >file_4 <file_3
выполняются одинаково: подсчитывается число строк файла "file_3" и результат
помещается в файл "file_4".
Средство, объединяющее стандартный выход одной команды со стандартным входом
другой, называется КОНВЕЙЕРОМ и обозначается вертикальной чертой "".
ls wc -l
список файлов текущего каталога будет направлен на вход команды "wc", которая на
экран выведет число строк каталога.
Конвейером можно объединять и более двух команд, когда все они, возможно кроме
первой и последней - фильтры:
cat file_1 grep -h result sort cat -b > file_2
Данный конвейер из файла "file_1" ("cat") выберет все строки, содержащие слово
"result" ("grep"), отсортирует ("sort") полученные строки, а затем пронумерует
("cat -b") и выведет результат в файл "file_2".
Поскольку устройства в ОС UNIX представлены специальными файлами, их можно
использовать при перенаправлениях. Специальные файлы находятся в каталоге
"/dev". Например, "lp" - печать; "console" - консоль; "ttyi" - i-ый терминал;
"null"- фиктивный (пустой) файл (устройство).
Тогда, например,
ls > /dev/lp
выведет содержимое текущего каталога на печать, а
file_1 < /dev/null
обнулит файл "file_1".
sort file_1 tee /dev/lp tail -20
В этом случае будет отсортирован файл "file_1" и передан на печать, а 20
последних строк также будут выданы на экран.
Вернемся к перенаправлению выхода. Стандартные файлы имеют номера:
0 - stdin,
1 - stdout
2 - stderr.
Если вам не желательно иметь на экране сообщение об ошибке, вы можете
перенаправить его с экрана в указанный вами файл (или вообще "выбросить",
перенаправив в файл "пустого устройства" - /dev/null). Например при выполнении
команды
cat file_1 file_2
которая должна выдать на экран последовательно содержимое файлов "file_1" и
"file_2", выдаст вам, например, следующее
111111 222222
cat: f2: No such file or directory
где 111111 222222 - содержимое файла "file_1", а файл "file_2" отсутствует, о
чем команда "cat" выдала сообщение в стандартный файл диагностики, по умолчанию,
как и стандартный выход, представленный экраном.
Если вам не желательно такое сообщение на экране, его можно перенаправить в
указанный вами файл:
cat file_1 file_2 2>f-err
сообщения об ошибках будут направляться (об этом говорит перенаправление "2>") в
файл "f-err". Кстати, вы можете всю информацию направлять в один файл "ff",
использовав в данном случае конструкцию
cat file_1 file_2 >>ff 2>ff
Можно указать не только какой из стандартных файлов перенаправлять, но и в какой
стандартный файл осуществить перенаправление.
cat file_1 file_2 2>>ff 1>&2
Здесь сначала "stderr" перенаправляется (в режиме добавления) в файл "ff", а
затем стандартный выход перенаправляется на "stderr", которым к этому моменту
является файл "ff". То есть результат будет аналогичен предыдущему.
Конструкция "1>&2" - означает, что кроме номера стандартного файла, в который
перенаправить, необходимо впереди ставить "&"; вся конструкция пишется без
пробелов.
<- закрывает стандартный ввод.
>- закрывает стандартный вывод.
... не зависимый от языка способ создания кода и привязки его к запросам Web-страниц, — .NET Web Forms — управляемую событиями программную модель взаимодействия с элементами управления. Она делает программирование Web-страниц аналогичным программированию форм Visual Basic. ASP.NET содержит развитые средства управления сеансами и функции защиты. Она надежнее, и производительность ее значительно выше ...
... "проверки заразности" (taint checks) в Perl? Как их включить? Как мы видели, одна из наиболее часто встречающихся проблем с безопасностью при программировании CGI - передача оболочке ОС пользовательских переменных без их проверки. Perl предлагает механизм проверки "заразности", который не позволяет этого делать. Любая переменная, которая проинициирована данными за пределами программы (включая ...
льный для каждого маршрута): "c: Курсовая моя < название маршрута > .txt" В таких файлах информация представлена например в следующем виде: автобус, 512 водитель, Батуров П.П. кондуктор, Иванова И.И. автобус, 513 водитель, Рябова Т.И. кондуктор, Шишкова Ю.М. автобус, 514 водитель, Продидж Н.Н. кондуктор, Мартысюк С.С. остановка, , 405, 4680 остановка, , 915, 2730 остановка, , ...
... интерфеса и интерфейса локольной сети · Предложение о выборе вариантов загрузки При этом возможен вариант запгрузки как с SCSI устройства (диск, CDROM, лента, …) так и через локальную сеть. Загрузочный диск должен быть предварительно сконфигурирован. Так как обьем Boot ROM не может быть большим, в его задачи входит загрузка вторичного загрузчика ...
0 комментариев