Управление заданиями в Bash
Одна из наиболее мощных возможностей Bash - это возможность помочь пользователю в управлении исполнением различных команд. На рисунке 1 показана базовая модель исполнения команд в UNIX. В этой модели каждая команда имеет стандартный механизм для обработки ввода-вывода:
-
STDIN (стандартное устройство ввода) позволяет программе получать входные данные из командной оболочки.
-
STDOUT (стандартное устройство вывода) позволяет программе передавать свои выходные данные командной оболочке.
-
STDERR (стандартное устройство вывода ошибок) позволяет программе передавать командной оболочке информацию о возникающих ошибках.
Обычно STDIN - это клавиатура, с помощью которой передается информация команде (как это делается в строке приглашения Bash), а STDOUT и STDERR - это экран, на который выводятся результаты. Однако можно изменить этот механизм ввода-вывода, например, так, чтобы команда читала и записывала данные в файл.
Рисунок 1. Стандартное выполнение команды
Для изменения стандартного механизма ввода-вывода в Bash используются команды перенаправления, список которых представлен в таблице 4.
Таблица 4. Перенаправление ввода-вывода в Bash
| Последовательность | Описание |
|---|
command < file
|
command < file перенаправляет STDIN на чтение из файла. |
command > file
|
command > file перенаправляет STDOUT на запись в файл. |
command >> file
|
command >> file перенаправляет STDOUT на дозапись в файл. |
command 2> file
|
command 2> file перенаправляет STDERR на запись в файл.. |
command1 | command2
|
command1 | command2 connects STDOUT подсоединяет STDOUT команды command1 к STDIN команды command2. |
Последний пункт в таблице 4 известен как конвейер и используется для объединения команд. Объединение команд с помощью конвейера - это ключевая техника программирования в командной оболочке UNIX, использующаяся, как продемонстрировано на рисунке 2. В этой модели каждая команда выполняет одну простую задачу и передает результат своей работы другой команде, которая также выполняет простую задачу, и так далее. Например, можно с помощью программы cat передать через конвейер содержимое файла команде grep, которая через конвейер передает все найденные строки команде wc, которая подсчитывает и выводит на экран количество строк в файле, содержащих заданную подстроку.
Рисунок 2. Объединение команд через конвейер
Асинхронное выполнение
Исполнение команд, которое описывалось выше, является синхронным, то есть в каждый момент времени выполняется только одна программа. Иногда команда или программа должна работать в течение долгого времени. Чтобы не отказываться от интерактивного использования, командной оболочки можно выполнять команды асинхронно. Для этого нужно дополнить команду знаком амперсанда (&). Это указывает командной оболочке запустить команду в фоновом режиме, что позволит продолжить работу в Bash. Листинг 5 демонстрирует эту и другие техники управления заданиями.
Листинг 5. Демонстрация управления заданиями в Bash
rb$ grep paper.pdf /var/log/httpd/access.log | wc -l
5
rb$ python demo.py &
[1] 20451
rb$ jobs
[1]+ Running python demo.py &
rb$ fg 1
python demo.py
|
Листинг 5 демонстрирует две различные техники управления заданиями. В первом примере команда grep ищет строку paper.pdf в лог-файле Web-сервера Apache Web. Результат работы этой команды передается через конвейер команде wc -l, которая считает количество строк. Таким образом, целиком команда подсчитывает число строк, содержащих paper.pdf в лог-файле.
Во втором примере программа на языке Python запускается в фоне для долговременной работы. Bash запускает это задание асинхронно в фоне и указывает идентификатор задания. Используя команду jobs, можно просмотреть список всех запущенных команд. В этом примере запущена только одна программа, она выводится из фоновой работы в синхронное выполнение с помощью команды fg. В этом руководстве было рассказано только об основных возможностях Bash по управлению заданиями. Чтобы стать мастером командной строки, необходимо более подробно изучить эту область.
|