Shell-скриптинг
Материал из Xgu.ru
Shell-скриптинг — написание сценариев командного интерпретатора пользователя (sh, bash, csh).
Действия, которые пользователь выполняется в оболочке, можно записать в файл, а потом выполнять их как единое целое. Такой файл называется сценарием или скриптом командного интепретатора (shell script). В самом простейшем случае скрипты создаются для того, чтобы сохранить некоторую повторяющуюся последовательность действий и в будущем вызывать её одной командой. Это простейшая, но далеко не единственная область применения скриптов. Вообще, скрипт — главный инструмент для автоматизации управления операционной системой.
...
Многие вещи можно сделать средствами самого интерпретатора, но, как правило, работа выполняется с помощью программ операционной системы, которые используются и как управляющие механизмы (например, для работы с файлами), и как расширители возможностей интерпретатора, например, такие как sed и awk, которые помогают манипулировать текстовыми потоками.
[править] Стиль
Стилистические и синтактические правила, которых рекомендуется придерживаться, при написании shell-скриптов (Bourne shell и bash):
- https://google.github.io/styleguide/shell.xml
- http://www.inquisitor.ru/doc/coding-style-shell.html
- http://www.cyberciti.biz/faq/bash-shell-script-function-examples/
[править] Вопросы и ответы
[править] Как сделать завершение скрипта при возникновении ошибки
По умолчанию скрипт не прерывается в случае возникновения ошибки при выполнении его команд.
Обрабатывать каждую ошибку вручную можно так:
команда || exit $?
Это не очень удобно, потому что команд, завершившихся с ошибкой, может быть очень много.
Можно сделать, что он будет завершаться, как только код выполнения командной строки[1] будет отличен от нуля.
%$ set -e
Теперь, например, при выполнении команды false скрипт будет завершаться. С другой стороны,
false || true
не приведёт к завершению, а
false ; true
приведёт.
Использование режима set -e обычно сопровождается назначением обработчика ошибки с помощью trap ERR. Обработчик вызывается перед тем как завершить интерпретатор при возникновении ошибки по set -e. Например, нам нужно удалить временные файлы перед завершением (условная функция cleanup_temp):
%$ trap cleanup_tmp ERR
Подробнее об этих и других способах обработки ошибок:
- Error handling in BASH (англ.)
[править] Как в скрипте (bash) обратиться к последнему аргументу?
${!#}
Если же эта конструкция не поддерживается, тогда нужно уже извращаться с eval, перебирать аргументы с помощью shift, одним словом, мудрить. Примеры вариантов решения: [1].
[править] Как узнать в каком каталоге находится текущий исполняемый скрипт?
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
Источник: [2]
[править] Как сделать чтобы команда убивалась по таймауту?
Можно поставить программу timeout, которая это делает.
$ apt-get install timeout $ timeout 10 sleep 20
Если программы ставить не хочется, то можно использовать такой трюк:
( cmdpid=$BASHPID; (sleep 10; kill $cmdpid) & exec ping www.goooooogle.com )
[править] Если bash/другой шелл такой классный и мощный, так может всё на нём писать? Чего в нём не хватает?
[править] Дополнительная информация
- Advanced Bash-Scripting Guide (англ.)
- Advanced Bash-Scripting Guide перевод (частичный)
- Shell Script Mistakes (англ.) несколько частов встречающихся стилистических ошибок при написании шелл-скриптов
[править] Примечания
- ↑ Здесь под командной строкой понимаются синтаксические конструкции, разделённые (;) или переводом строки
Интерфейс командной строки | |
---|---|
Основы | Потоки ввода/вывода • Командная строка |
Пользовательское окружение | Оболочка интерпретатора • Приглашение командного интерпретатора • bash_completion • shopt |
Скриптинг | Скриптинг • Интерпретатор • Shebang • Shell-скриптинг • shell-framework • expect • awk • sed |