Сценарии
Перед переходом к особенностям написания bash-сценариев следует изучить методику этого процесса. Многие администраторы пишут bash-сценарии так же, как Perl- или Python-сценарии, т.е. используя какой-либо текстовый редактор, но рекомендуется для удобства рассматривать в качестве интерактивной среды разработки сценариев режим с приглашением на ввод команды.
В качестве примера можно рассмотреть наличие журналов регистрации, именованных с суффиксами .log и .LOG и размещенных по всей иерархической структуре каталогов, необходимость изменения этих суффиксы, приведя их наименования к прописному виду.
Сначала нужно отыскать все эти файлы:
$ find. -name '*log'
.do-not-touch/important.log
admin.com-log/
foo.log
genius/spew.log
leather_flog
Далее необходимо включить в шаблон точку и игнорировать при поиске каталоги, для чего нажать комбинацию клавиш Ctrl+P, чтобы вернуть команду в командную строку, а затем модифицировать ее.
$ find.-type f -name '*.log'
.do-not-touch/important.log
foo.log
genius/spew.log
С внесением таких изменений вывод команды становится более понятным. При необходимости можно избавиться от каталога .do-not-touch следующим образом:
$ find. -type f -name '*.log ' | grep -v.do-not-touch
foo.log
genius/spew.log
Теперь получен абсолютно точный список файлов, которые должны быть переименованы.
Далее можно попробовать сгенерировать несколько новых имен.
$ find. -type f -name '*.log ' I grep -v.do-not-touch | while read fname
> do
> echo mv $ fname $ {fname/. log/. LOG/}
> done
mv foo.log foo.LOG
mv genius/spew.log genius/spew.LOG
Эти команды позволяют переименовать нужные файлы.
В реальности можно снова вызвать уже выполненную команду и отредактировать команду echo, чтобы заставить оболочку bash выполнять команды mv, а не просто выводить их, так как передача команд в отдельную копию оболочки bash более надежный вариант работы, который к тому же требует меньшего объема редактирования.
При нажатии комбинации клавиш Ctrl+P оболочка bash сворачивает мини-сценарий данного примера в одну. К этой уплотненной командной строке нужно добавить канал, передающий выходные данные команде bash -х.
$ find. -type f -name '*.log ' I grep -v.do-not-touch | while read fname;
do echo mv $fname $ {fname/. log/. LOG/}; done | bash -x
+ mv foo.log foo.LOG
+ mv genius/spew.log genius/spew.LOG
Ключ -x команды bash обеспечивает вывод каждой команды перед ее выполнением.
Теперь переименование файлов завершено, но полезно сохранить этот сценарий, чтобы воспользоваться им вновь. Встроенная в bash команда fc по своему действию во многом аналогична нажатию комбинации клавиш Ctrl+P, но вместо возврата последней команды в командную строку она передает команду в заданный редактор. Следует добавить в нужный файл строку идентификационного комментария, поместить сохраненный файл в приемлемый каталог (например, ~/bin или /usr/local/bin), сделать файл исполняемым, чтобы в итоге получить настоящий сценарий.
Рекомендации по использованию сценариев:
- Разработка сценария (или его части) в виде конвейера команд, причем пошагово и в режиме выполнения командных строк.
- Пересылка результата в стандартный выходной поток, проверяя правильность работы используемых команд.
- Использование на каждом этапе буфера ранее выполненных команд для их появления в командной строке и инструментов редактирования для их модификации.
- Сохранение всех команд сценария до тех пор, пока они команды не заработают должным образом.
- Выполнение команды на реальном примере при получении правильного результата, чтоб убедиться в достоверности.
- Использование команды
fсдля фиксации работы в редакторе, оформления ее соответствующим образом и сохранения.
В приведенном выше примере были выведены командные строки, а затем направлены в подоболочку для выполнения. Этот метод не является универсально применимым, но часто оказывается полезным. В качестве альтернативного варианта можно фиксировать результаты, перенаправляя их в файл.
Рекомендуется добиваться при разработке сценариев получения нужных результатов, и до этих пор не выполнять никаких потенциально деструктивных действий.