Искусство программирования на языке сценариев командной оболочки
Шрифт:
locate $1
# В худшем случае, без команды wait, сценарий завершил бы свою работу до того,
# как завершила бы работу утилита 'updatedb',
# сделав из нее "осиротевший" процесс.
exit 0
Команда wait может принимать необязательный параметр -- номер задания/процесса, например, wait %1 или wait $PPID.
#!/bin/bash
# test.sh
ls -l &
echo "Done."
bash$ ./test.sh
Done.
[bozo@localhost test-scripts]$ total 1
– rwxr-xr-x 1 bozo bozo 34 Oct 11 15:09 test.sh
_
Разместив команду wait, после запуска фонового задания, можно предотвратить такое поведение сценария.
#!/bin/bash
# test.sh
ls -l &
echo "Done."
wait
bash$ ./test.sh
Done.
[bozo@localhost test-scripts]$ total 1
– rwxr-xr-x 1 bozo bozo 34 Oct 11 15:09 test.sh
Перенаправление вывода в файл или даже на устройство /dev/null также снимает эту проблему.
suspend
Действует аналогично нажатию на комбинацию клавиш Control+– Z, за исключением того, что она приостанавливает работу командной оболочки.
logout
Завершает сеанс работы командной оболочки, можно указать необязательный код завершения.
times
Выдает статистику исполнения команд в единицах системного времени, в следующем виде:
0m0.020s 0m0.020s
Имеет весьма ограниченную сферу применения, так как сценарии крайне редко подвергаются профилированию.
kill
Принудительное завершение процесса путем передачи ему соответствующего сигнала (см. Пример 13-4).
Пример 11-23. Сценарий, завершающий себя сам с помощью команды kill
#!/bin/bash
# self-destruct.sh
kill $$ #
# Надеюсь вы еще не забыли, что "$$" -- это PID сценария.
echo "Эта строка никогда не будет выведена."
# Вместо него на stdout будет выведено сообщение "Terminated".
exit 0
# Какой код завершения вернет сценарий?
#
# sh self-destruct.sh
# echo $?
# 143
#
# 143 = 128 + 15
# сигнал TERM
command
Директива command COMMAND запрещает использование псевдонимов и функций с именем "COMMAND".
builtin
Конструкция builtin BUILTIN_COMMAND запускает внутреннюю команду "BUILTIN_COMMAND", на время запрещая использование функций и внешних системных команд с тем же именем.
enable
Либо запрещает, либо разрешает вызов внутренних команд. Например, enable -n kill запрещает использование внутренней команды kill, в результате, когда интерпретатор встретит команду kill, то он вызовет внешнюю команду kill, т.е. /bin/kill.
Команда enable -a выведет список всех внутренних команд, указывая для каждой -- действительно ли она разрешена. Команда enable -f filename загрузит внутренние команды как разделяемую библиотеку (DLL) из указанного объектного файла [ 26 ] .
26
Как правило, исходные тексты подобных библиотек, на языке C, располагаются в каталоге /usr/share/doc/bash-?.??/functions.
Обратите внимание: ключ -f команды enable может отсутствовать в некоторых системах.