Как получить полный путь к текущему сценарию оболочки? - PullRequest
4 голосов
/ 17 марта 2010

Есть ли менее грубый способ сделать это?

#!/bin/ksh
THIS_SCRIPT=$(/usr/bin/readlink -f $(echo $0 | /bin/sed "s,^[^/],$PWD/&,"))
echo $THIS_SCRIPT

Я застрял, используя ksh, но предпочел бы решение, которое работает и в bash (что, я думаю, так и есть).

Ответы [ 3 ]

5 голосов
/ 17 марта 2010

Запись № 28 в bash FAQ:

Как мне определить местоположение моего скрипта? Я хочу прочитать некоторые файлы конфигурации из того же места.

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

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

...

Использование BASH_SOURCE

Внутренняя переменная BASH_SOURCE представляет собой массив путей. Если вы развернете его как простую строку, например, «$ BASH_SOURCE», вы получите первый элемент, который является путем к текущей выполняемой функции или скрипту.

5 голосов
/ 17 марта 2010

Я всегда делал:

SCRIPT_PATH=$(cd `dirname ${0}`; pwd)

Я никогда не использовал readlink раньше: это только Gnu? (т.е. будет ли он работать на HP-UX, AIX и Solaris из коробки? dirname и pwd будут ....)

(отредактировано, чтобы добавить ``, которое я забыл в оригинальном сообщении. D'oh!) (отредактируйте 2, чтобы поставить две строки, которые я, очевидно, всегда делал, когда смотрю на предыдущие сценарии, которые написал, но не запомнил правильно. Первый вызов получает путь, второй вызов устраняет относительный путь) (отредактируйте 3 исправленные опечатки, которые не позволяли работать однострочному ответу, назад к одной строке!)

4 голосов
/ 17 марта 2010

Почему я не подумал попробовать это, прежде чем задал вопрос?

THIS_SCRIPT=$(/usr/bin/readlink -nf "$0")

Отлично работает.

...