Сценарии

Перед переходом к особенностям написания 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), сделать файл исполняемым, чтобы в итоге получить настоящий сценарий.

Рекомендации по использованию сценариев:

  • Разработка сценария (или его части) в виде конвейера команд, причем пошагово и в режиме выполнения командных строк.
  • Пересылка результата в стандартный выходной поток, проверяя правильность работы используемых команд.
  • Использование на каждом этапе буфера ранее выполненных команд для их появления в командной строке и инструментов редактирования для их модификации.
  • Сохранение всех команд сценария до тех пор, пока они команды не заработают должным образом.
  • Выполнение команды на реальном примере при получении правильного результата, чтоб убедиться в достоверности.
  • Использование команды для фиксации работы в редакторе, оформления ее соответствующим образом и сохранения.

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

Рекомендуется добиваться при разработке сценариев получения нужных результатов, и до этих пор не выполнять никаких потенциально деструктивных действий.