Запустите script в том же каталоге, что и текущий script
У меня есть два сценария Bash в той же папке (где-то сохранен пользователем, который загружает весь репозиторий):
-
script.sh
выполняется пользователем
-
helper.sh
требуется и выполняется script.sh
Два сценария должны находиться в одном каталоге. Мне нужен первый script для вызова второго, но есть две проблемы:
- Знание текущего рабочего каталога бесполезно для меня, потому что я не знаю, как пользователь выполняет первый script (может быть с
/usr/bin/script.sh
, с ./script.sh
, или он может быть с ../Downloads/repo/scr/script.sh
)
- script
script.sh
будет изменен на другой каталог перед вызовом helper.sh
.
Я могу определенно взломать Bash, что делает это, сохраняя текущий каталог в переменной, но этот код кажется излишне сложным, поскольку я думаю, это очень общая и простая задача.
Существует ли стандартный способ надежного вызова helper.sh
изнутри script.sh
? И будет работать в любой поддерживаемой операционной системе Bash?
Ответы
Ответ 1
Так как $0
содержит полный путь к запущенному script, вы можете использовать dirname
, чтобы получить путь script:
#!/bin/bash
script_name=$0
script_full_path=$(dirname "$0")
echo "script_name: $script_name"
echo "full path: $script_full_path"
поэтому, если вы, например, сохраните его в /tmp/a.sh
, вы увидите вывод, например:
$ /tmp/a.sh
script_name: /tmp/a.sh
full path: /tmp
так
- Знание текущего рабочего каталога для меня бесполезно, потому что я не знаю, как пользователь выполняет первый script (может быть с
/usr/bin/script.sh
, с ./script.sh
, или это может быть с ../Downloads/repo/scr/script.sh
)
Использование dirname "$0"
позволит вам отслеживать исходный путь.
- script
script.sh
будет изменен на другой каталог перед вызовом helper.sh
.
Опять же, поскольку у вас есть путь в $0
, вы можете cd
вернуться к нему.