bash dirname $0 (замена)

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
cy6erGn0m
Сообщения: 119
ОС: MandrivaLinux/Solaris 10

bash dirname $0

Сообщение cy6erGn0m »

Нужна помощь в написании скрипта..

Раньше я часто применял следующую конструкцию

Код: Выделить всё

BASEDIR=`dirname $0`
BASEDIR=`cd $BASEDIR; pwd`

export $la-la-la=$la-la-la:$BASEDIR/lala
...



Однако на устройстве нет dirname.. и никак не могу обойти это ограничение.
Однако могу пойти на уступку: в той же папке что и скрипт могу положить bin/dirname.

Сразу предупреждаю, что установить ничего не устройство нельзя. coreutils в чистом виде отсутствует.
I want to Believe!

They must find it difficult...
Those who have taken authority as the truth,
Rather than trusth as the authority.
/G.Messey/
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4462
Статус: GNU generation
ОС: Debian GNU/Linux

Re: bash dirname $0

Сообщение Rootlexx »

А cut и rev присутствуют? Можно сделать так:

Код: Выделить всё

function dirname()
{
        printf "%s" "$1" | rev | cut -d '/' -f 2- | rev;
}

Можно ещё сделать так:

Код: Выделить всё

function dirname()
{
        local path="$1";
        printf "%s" "${path%/*}";
}
Спасибо сказали:
Аватара пользователя
cy6erGn0m
Сообщения: 119
ОС: MandrivaLinux/Solaris 10

Re: bash dirname $0

Сообщение cy6erGn0m »

Да, второй вариант прошёл, написал:

Код: Выделить всё

BASEDIR="$0"
BASEDIR="${BASEDIR%/*}"
BASEDIR=`cd $BASEDIR; pwd`

echo "Base directory is $BASEDIR"

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$BASEDIR/lib
..........


Спасибо большое!

PS: cut и rev отсутствовали.
I want to Believe!

They must find it difficult...
Those who have taken authority as the truth,
Rather than trusth as the authority.
/G.Messey/
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4462
Статус: GNU generation
ОС: Debian GNU/Linux

Re: bash dirname $0

Сообщение Rootlexx »

Правда, есть один нюанс: если путь заканчивается на «/» (или это корень :)), то результат будет неожиданным. В таком случае надо использовать:

Код: Выделить всё

BASEDIR="${BASEDIR%/?*}"
, что гарантирует наличие символов после «/». Это сразу захватывает все случаи:

Код: Выделить всё

alexey@desktop:~$ s="/usr/share/apps"
alexey@desktop:~$ echo ${s%/?*}
/usr/share
alexey@desktop:~$ s="/usr/share/apps/"
alexey@desktop:~$ echo ${s%/?*}
/usr/share
alexey@desktop:~$ s="/"
alexey@desktop:~$ echo ${s%/?*}
/
alexey@desktop:~$
Спасибо сказали: