LINUX.ORG.RU

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

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

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

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

IPR ★★★★★ ()

Можно так

#!/bin/bash

# Start of the script
SCRIPT_PATH=$(realpath $0)

# ...
echo $SCRIPT_PATH

backbone ★★★★★ ()
~ > echo '#!/bin/sh\necho `pwd`/`basename $0`' > script.sh
~ > ./script.sh 
/home/gotf/script.sh
GotF ★★★★★ ()

rain@debian:~$ cat file.sh
#!/bin/bash

readlink -f $0
rain@debian:~$ bash file.sh
/home/rain/file.sh

YAR ★★★★★ ()

readlink -f $0
Или например через dirname $0/pwd

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

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

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

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

Без внешних вызовов:

------------------
#!/bin/sh

cc=`pwd`

cd ${0%/*}

SCRIPT_PATH=`pwd`

cd ${cc}

echo $SCRIPT_PATH
------------------

sergv ()

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

</thread>

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

rain@debian:~$ realpath
bash: realpath: команда не найдена


Это откуда? Свежий баш?

YAR ★★★★★ ()
Ответ на: комментарий от 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 ()

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

#!/bin/sh

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

echo $DIRFILE
echo $CURFILE
echo $CURDIR

cd $CURDIR

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