Простые Bash-скрипты как исполняемые файлы со списком команд

Bash ‒ это не только среда для выполнения команд, также язык программирования. Написанные на Bash программы, или скрипты, помещают в файлы, которые делают исполняемыми, после чего передают интерпретатору Bash (просто запускают в командной оболочке).

Несмотря на то, что в языке Bash имеются условия, циклы и функции, он является достаточно простым, сложных сценариев на нем не пишут. Если же такая необходимость возникает, делают выбор в пользу Python, Си или других языков.

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

Файл можно подготовить в текстовом редакторе или в совсем простых случаях создать с помощью команд cat или echo. Текстовый редактор (не путайте с приложениями для набора и оформления текста для чтения на естественном языке) может быть любым, в том числе с графическим интерфейсом пользователя. Однако существуют и консольные, которые запускаются непосредственно в терминале. Такими являются, например, Nano (команда nano) и Vim (Базовые операции в Vim).

Обычно первой строкой в командных скриптах записывается путь до программы bash. Его предваряют шебангом (#!):

#!/bin/bash

или

#!/usr/bin/bash

Однако скрипт может работать и без этого, если запускать его из командной оболочки.

Разделителем команд в Bash-скрипте являются либо переход на новую строку, либо точка с запятой. Кстати, использовать точку с запятой можно и в командной оболочке, когда несколько команд дается в одной строке.

Запишем с помощью программы cat в файл пару команд:

Запись команд для Bash в файл

То, что мы вводим с клавиатуры и видим на экране, отправляется в файл today. С помощью второго вызова cat убеждаемся, что файл содержит необходимые команды.

Если сейчас в командной строке написать одно название файла, Bash сообщит, что команда не найдена. Действительно, выполнять можно только исполняемые файлы, то есть такие, в правах которых установлен атрибут 'x'. Однако это не мешает передать файл в качестве аргумента программе bash, то есть командной оболочке.

Исполнение записанных в файл команд с помощью нового процесса bash

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

Исполняемый файл с командами для Bash

Мы указываем каталог, где находится наш исполняемый файл потому, что Bash не знает о его существовании. Командная оболочка просматривает только определенные каталоги на предмет наличия в них исполняемых программ. Список таких каталогов содержится в переменной PATH.

Переменная PATH командной оболочки Bash

Каталоги разделяются двоеточием. Как видно на скрине в списке в данном случае домашнего каталога нет. Мы могли бы переместить наш файл в один из указанных каталогов или добавить в переменную PATH наш каталог. Однако бывает проще и безопаснее оставить все как есть, и просто дописывать перед командным файлом адрес.

Пример создания файла с помощью команды echo:

Пример создания файла со списком команд с помощью команды echo

В приведенном выше примере просматриваемый каталог задается программно. Однако скорее всего мы захотели бы использовать подобный скрипт по отношению к разным каталогам. Их можно передавать при вызове программы. В Bash-скрипте они будут присвоены специальным переменным-параметрам. Так первый аргумент после имени скрипта присваивается переменной $1. Тогда наша программа на языке Bash будет выглядеть так:

#!/usr/bin/bash
date
echo -n "Каталог: "
ls -d $1
ls -l $1

А ее вызовы так:

$ ./test.sh /home/pl/Android/
$ ./test.sh Загрузки

Если не указать каталог, то будет выведено содержимое текущего.

Более практичный пример ‒ использовать Bash-скрипт для git-репозитория. Допустим, перед каждым коммитом изменения добавляются в проект (команда git add .), потом выполняется коммит (git commit -m "пояснение внесенных изменений"), в конце делается пуш изменений на сервер (git push). Назовем скрипт fastgit.sh:

#!/usr/bin/bash
git add .
git commit -m "$1"
git push

Добавим права на исполнение:

$ chmod +x fastgit.sh

Пример вызова:

$ ./fastgit.sh "Добавлен файл style_media.css"