LINUX.ORG.RU

Как получить полный путь до выполняемого скрипта?

 


0

1

Подскажите, плиз, сабж. Если запускаю командой вида ./script, $0 возвращает только script, без дот-слэш. А желательно получить полный путь вида /home/user/script. Заранее благодарю за ответ.

★★★★★

При помощи shell, насколько мне известно, никак. Можно использовать промежуточный интерпретатор другого языка, где есть эта фича. Например, tcl.

geekless ★★
()
Ответ на: комментарий от geekless

При помощи shell, насколько мне известно, никак. Можно использовать промежуточный интерпретатор другого языка, где есть эта фича. Например, tcl.

Это херово :( Возможности использовать что-то кроме shell нет. Беда.

IPR ★★★★★
() автор топика
Ответ на: комментарий от sergv

А теперь: $ mv script.sh bin $ cd /usr && /home/gotf/bin/script.sh

Да. В этом и проблема. sh знает точный путь к файлу, но скрипту его ни за что не скажет. Почему это не пофикшено за десятилетия — хз. Может есть способ, просто мы не знаем? Переменная какая-нибудь?

geekless ★★
()
Ответ на: комментарий от backbone

Спасибо, работает.

IPR ★★★★★
() автор топика
Ответ на: комментарий от YAR

readlink -f $0

Тоже работает, сенкс.

IPR ★★★★★
() автор топика

Всем спасибо за ответы.

</thread>

IPR ★★★★★
() автор топика
Ответ на: комментарий от sergv

Стоп-стоп... Вполне вероятно, я тупой олень. Не исключаю. Я был уверен, что вызов без явно указанного пути (т.е. с подстановкой через PATH) даёт в $0 не полный путь, а только последнюю часть. Я был уверен, потому что когда-то проверял.

Мне пора пить таблетки от ложной памяти?

geekless ★★
()
Ответ на: комментарий от geekless

Да не полный он дает. Путь вызова дает: полный или относительно текущего каталога.

Кстати, мое поделие видимо работать не будет если скрипт в $PATH

sergv
()
Ответ на: комментарий от sergv

Работает, блин! :-)

Вот я и удивляюсь.

Проверил в dash и csh, чтобы убедиться, что это не башизм. Всё. Признаю себя тупой макакой. :-D

geekless ★★
()
Ответ на: комментарий от YAR
[I] app-misc/realpath
     Available versions:  1.16 {{nls}}
     Installed versions:  1.16(12:12:09 03.02.2012)(nls)
     Homepage:            http://packages.debian.org/unstable/utils/realpath
     Description:         Return the canonicalized absolute pathname

Даже не подозревал, что отдельный пакет. Тогда readlink -f лучше...

backbone ★★★★★
()
Ответ на: комментарий от backbone

Даже не подозревал, что отдельный пакет. Тогда readlink -f лучше...

Хм, в базовой поставке FreeBSD есть.

IPR ★★★★★
() автор топика

Синтаксис test для BASH, но исправить нетрудно:

    dName="$( dirname "${0}" )"
    fName="$( basename "${0}" )"
    
    [ "${dName}" == "." ] && dName="$( pwd )"
    [ -z "${dName}" ] && dName="$( pwd )"
    echo "${dName}/${fName}"

Artif
()
26 ноября 2012 г.

У меня заработал только такой вариант:

#!/bin/sh

DIRFILE=`readlink -e "$0"`
CURFILE=`basename "$DIRFILE"`
CURDIR=`dirname "$DIRFILE"`

echo $DIRFILE
echo $CURFILE
echo $CURDIR

cd $CURDIR

Novator ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.