Как получить путь к файлу скрипта внутри самого скрипта при вызове через ссылку sym - PullRequest
8 голосов
/ 28 мая 2009

Когда мне нужно получить путь к файлу скрипта внутри самого скрипта, я использую что-то вроде этого:

`dirname $0`

это работает файл, пока я не вызову скрипт через ссылку на него. В этом случае код выше печатает расположение ссылки вместо исходного файла.

Есть ли способ получить путь к исходному файлу скрипта, а не ссылку?

Спасибо, Mike

Ответы [ 5 ]

15 голосов
/ 28 мая 2009
if [ -L $0 ] ; then
    DIR=$(dirname $(readlink -f $0)) ;
else
    DIR=$(dirname $0) ;
fi ;
15 голосов
/ 28 мая 2009

Вы действительно должны прочитать следующую статью BashFAQ:

Правда в том, что хаки $0 НЕ являются надежными, и они будут давать сбой, когда приложения запускаются с нулевым аргументом, который не является путем приложения. Например, login(1) поместит - перед именем вашего приложения в $0, что приведет к поломке, и всякий раз, когда вы вызываете приложение, которое находится в PATH $0, не будет содержать путь к вашему приложению, но просто имя файла, что означает, что вы не можете извлечь из него информацию о местоположении. Есть еще много способов, которыми это может не сработать.

Итог: не надейтесь на взлом, правда в том, что вы не можете выяснить, где находится ваш скрипт, поэтому используйте опцию конфигурации, чтобы установить каталог ваших файлов конфигурации или что вам нужно путь к скрипту для.

6 голосов
/ 28 мая 2009

Используйте readlink для этого:

readlink -f "$0"
1 голос
/ 06 января 2013
Dir=$(dirname $(readlink -f "$0"))
0 голосов
/ 15 сентября 2016

Я предлагаю это:

dirname $(realpath $0)

пример:

skaerst@test01-centos7:~/Documents> ../test/path.sh 
dirname realpath: /home/skaerst/test

skaerst@test01-centos7:~/Documents> cat ../test/path.sh
#!/bin/bash

echo "dirname realpath: $(dirname $(realpath $0))"

также работает с символическими ссылками, потому что realpath по умолчанию использует -P:

skaerst@test01-centos7:~/Documents> ln -s ../test/path.sh p
skaerst@test01-centos7:~/Documents> ./p
dirname realpath: /home/skaerst/test

realpath доступен с coreutils> 8.5, я думаю

skaerst@test01-centos7:~/Documents> rpm -qf $(which realpath) $(which dirname)
coreutils-8.22-15.el7_2.1.x86_64
coreutils-8.22-15.el7_2.1.x86_64

НТН

Привет

Stefan

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...