Запустите 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" позволит вам отслеживать исходный путь.

  1. script script.sh будет изменен на другой каталог перед вызовом helper.sh.

Опять же, поскольку у вас есть путь в $0, вы можете cd вернуться к нему.