Следим за порядком

Еще один пример средств объединения команд Bash, который обычно есть в других языках программирования - средства для управления порядком выполнения команд. До этого момента Bash выполнял команды именно в том порядке, в каком мы их записывали; ну, а если нужно изменить поведение программы в зависимости от некоторых условий? Это позволят сделать условные операторы.
Первый из них - оператор if...then. Он проверяет, верно ли некоторое условие, например, существует ли указанный файл, и только если условие верно, выполняет следующий код: #!/bin/bash if ( 2 > 1 ); then echo “True” fi
$PATH
В выполнении команд в Bash нет ничего таинственного. Когда вы вводите имя команды, оболочка находит исполняемый файл или скрипт, на который ссылается имя, и затем выполняет его, как если бы это был обычный скрипт или программа, выполняемые пользователем, как в ./hello.bash. Но если не указать абсолютный путь к программе, как оболочка узнает, где искать файл?
Ответ - переменная $PATH. В вашей оболочке есть масса переменных «окружения», которые влияют на то, как в текущей оболочке выполняются программы и интерпретируются команды. Одна из таких переменных называется PATH и содержит список каталогов, где могут быть найдены двоичные файлы команд или скрипты.
Каждый раз, когда вы вводите имя команды, оболочка просматривает список каталогов в этой переменной слева направо, пока не найдет файл с тем же именем, что и имя команды, которую вы только что запустили. Если оболочка не найдет файла, она выдаст сообщение об ошибке: bash: foo: command not found
Содержимое переменной $PATH можно просмотреть, как и содержимое любой другой переменной, выведя его на экран: echo ${PATH}. И так же, как и значение любой другой переменной, его можно изменить. Если вы хотите, чтобы изменения сохранились после завершения текущего сеанса оболочки, нужно добавить их в один из файлов настройки Bash, .bashrc или .bash_profile, в зависимости от того, относятся ли эти изменения к оболочкам входа в систему, под оболочкам или и к тем, и к другим.
Это пример тривиальный, так как он всегда будет выводить True, но он демонстрирует синтаксис. В Bash операторы if начинаются с ключевого слова if, за которым в квадратных скобках следует проверяемое условие. За ним следует ключевое слово then, а далее - команды, выполняемые в том случае, если условие верно; после этого оператор замыкается ключевым словом fi.
В Bash есть целый набор встроенных проверок, многие из которых очень полезны, например, f, которая проверяет, что файл существует, и nt, которая проверяет, что один файл новее другого: if ( f /var/run/backup.lock ); then exit 1 else touch /var/run/backup.lock tar czf /mnt/backup$(date +%Y%m%d).tgz/home/jon rm /var/run/backup.lock fi
В этом примере мы проверяем, существует ли файл блокировки. Если да, мы не начинаем новой операции резервного копирования, так как предыдущая еще выполняется. Если файла блокировки нет, мы создаем его в блоке else, выполняем резервное копирование и затем удаляем файл блокировки.
Советуем потратить немного времени и взглянуть на man страницу Bash, чтобы узнать, какие проверки еще доступны.
Хотя мы говорили, что не будем отвлекаться на рассказы об отдельных командах Bash, которые встретятся в этой статье, команде exit стоит уделить немного больше внимания. Когда программа или команда Bash завершается, она возвращает числовое значение. 0 принято считать обозначением успешного завершения команды, а все остальные значения показывают: что-то пошло не так. Такое особенно полезно в сочетании со встроенной переменной ?, которая хранит код завершения предыдущей команды - это позволяет управлять ходом программы в зависимости от успешного или неудачного завершения ее частей.