Shell-скриптинг

Материал из Xgu.ru

Перейти к: навигация, поиск


Shell-скриптинг — написание сценариев командного интерпретатора пользователя (sh, bash, csh).

Действия, которые пользователь выполняется в оболочке, можно записать в файл, а потом выполнять их как единое целое. Такой файл называется сценарием или скриптом командного интепретатора (shell script). В самом простейшем случае скрипты создаются для того, чтобы сохранить некоторую повторяющуюся последовательность действий и в будущем вызывать её одной командой. Это простейшая, но далеко не единственная область применения скриптов. Вообще, скрипт — главный инструмент для автоматизации управления операционной системой.

...

Многие вещи можно сделать средствами самого интерпретатора, но, как правило, работа выполняется с помощью программ операционной системы, которые используются и как управляющие механизмы (например, для работы с файлами), и как расширители возможностей интерпретатора, например, такие как sed и awk, которые помогают манипулировать текстовыми потоками.


Содержание

[править] Стиль

Стилистические и синтактические правила, которых рекомендуется придерживаться, при написании shell-скриптов (Bourne shell и bash):

[править] Вопросы и ответы

[править] Как сделать завершение скрипта при возникновении ошибки

По умолчанию скрипт не прерывается в случае возникновения ошибки при выполнении его команд.

Обрабатывать каждую ошибку вручную можно так:

 команда || exit $?

Это не очень удобно, потому что команд, завершившихся с ошибкой, может быть очень много.

Можно сделать, что он будет завершаться, как только код выполнения командной строки[1] будет отличен от нуля.

 %$ set -e

Теперь, например, при выполнении команды false скрипт будет завершаться. С другой стороны,

false || true 

не приведёт к завершению, а

false ; true 

приведёт.

Использование режима set -e обычно сопровождается назначением обработчика ошибки с помощью trap ERR. Обработчик вызывается перед тем как завершить интерпретатор при возникновении ошибки по set -e. Например, нам нужно удалить временные файлы перед завершением (условная функция cleanup_temp):

 %$ trap cleanup_tmp ERR

Подробнее об этих и других способах обработки ошибок:

[править] Как в скрипте (bash) обратиться к последнему аргументу?

${!#}

Если же эта конструкция не поддерживается, тогда нужно уже извращаться с eval, перебирать аргументы с помощью shift, одним словом, мудрить. Примеры вариантов решения: [1].

[править] Как узнать в каком каталоге находится текущий исполняемый скрипт?

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

Источник: [2] Stackoverflow.png

[править] Как сделать чтобы команда убивалась по таймауту?

Можно поставить программу timeout, которая это делает.

$ apt-get install timeout
$ timeout 10 sleep 20

Если программы ставить не хочется, то можно использовать такой трюк:

( cmdpid=$BASHPID; (sleep 10; kill $cmdpid) & exec ping www.goooooogle.com )

Источники: [3], [4]

[править] Если bash/другой шелл такой классный и мощный, так может всё на нём писать? Чего в нём не хватает?

[править] Дополнительная информация

[править] Примечания

  1. Здесь под командной строкой понимаются синтаксические конструкции, разделённые (;) или переводом строки