Как запустить сценарий с другого пути и узнать путь сценария?

8

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

Например: у меня есть скрипт /home/me/folder/script.sh, и этот скрипт будет обращаться к файлу /home/me/folder/myfile. Поскольку файл находится в том же пути сценария, я просто использую имя myfile, а не полный путь.

Но если я запускаю его /tmp/, например:

/tmp$ /home/me/folder/script.sh

это дает мне:

myfile: No such file or directory

Итак, как я могу сказать в сценарии, что файл находится в том же пути, что и сам сценарий?

Том Брито
источник
Можете ли вы показать, что использование myfile здесь?
Фахим Митха
@Faheem Mitha: просто еще один скрипт, который вызывает мой script.sh.
Том Брито
По какой-то причине вы не хотите использовать полный путь или перенести оба из них в свой PATH?
Фахим Мита
1
@Faheem Mitha: я хочу иметь возможность переместить эту папку со сценариями в другое место, возможно, даже на другой компьютер, без необходимости переписывать путь myfile.
Том Брито,

Ответы:

9

Вы не можете знать ни при каких обстоятельствах, но часто (не всегда), когда вы запускаете сценарий по пути вместо того, чтобы разрешить поиск в оболочке $PATH, путь к сценарию будет указан $0. Затем вы можете использовать dirname "$0"или, ${0%/*}чтобы получить путь.

geekosaur
источник
4

Я обычно делал бы что-то вроде этого во главе моего сценария:

SCRIPTDIR=$(dirname "$0")

Или, чтобы получить полный путь к каталогу скрипта (вместо относительного пути):

SCRIPTDIR=$(cd $(dirname "$0") && pwd)

Тогда просто ссылка, ${SCRIPTDIR}где это необходимо.

Ричард Даунер
источник