Иногда нужно знать, в каком каталоге находится запущенный скрипт. Ну, например, в этом же каталоге лежат другие скрипты, которые должны быть запущены текущим выполняющемся скриптом. Для того, чтобы он их запустил, ему было бы неплохо знать, где их искать, потому что вы могли запустить скрипт находясь в совершенно произвольной директории, или воспользоваться для запуска не самим файлом скрипта, а символической ссылкой, лежащей в другом каталоге, которая указывает на файл скрипта.
Можно, конечно, поступить просто и в самом скрипте в переменной жёстко прописать полный путь до каталога, в котором этот скрипт лежит. Получится что-то вроде этого:
Для красивого решения проблемы нужно знать всего три вещи:
Можно, конечно, поступить просто и в самом скрипте в переменной жёстко прописать полный путь до каталога, в котором этот скрипт лежит. Получится что-то вроде этого:
#!/bin/bash DIRECTORY="/home/user/my_scripts" cd $DIRECTORY # запуск "соседних" скриптов ./script1.sh ./script2.shВполне рабочий вариант и две обозначенные выше проблемы будут решены, но если надо будет переместить скрипт в другой каталог, то и значение переменной придётся руками поменять в самом скрипте. Не очень удобно.
Для красивого решения проблемы нужно знать всего три вещи:
- Путь до выполняющегося скрипта можно узнать с помощью $0, но проблема в том, что он относительный, т.е. если вы запустите скрипт как ./script.sh, то и $0 будет содержать ./script.sh
- Команда readlink с параметром -e решит сразу две проблемы: во-первых она вернет полный путь до файла скрипта, если вы воспользовались для запуска символической ссылкой (даже если это была цепочка симлинков), а во-вторых преобразует относительный путь, если такой получен с помощью $0, в абсолютный
- Чтобы избавиться от имени файла скрипта в конце абсолютного пути, нужно воспользоваться командой dirname
#!/bin/bash # полный путь до скрипта ABSOLUTE_FILENAME=`readlink -e "$0"` # каталог в котором лежит скрипт DIRECTORY=`dirname "$ABSOLUTE_FILENAME"` # запуск "соседних" скриптов $DIRECTORY/script1.sh $DIRECTORY/script2.sh