URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 77121
[ Назад ]

Исходное сообщение
"Маленький вопрос про Bash."

Отправлено stakado , 01-Ноя-07 12:41 
Доброго времени суток!
Подскажите, плиз, как из скрипта узнать место его расположения?
Например есть скрипт: /home/services/traffic-spy/traffic-spy.sh
Хочется узнать его расположение, т.е. - /home/services/traffic-spy/

Использовать $0 невозможно, ввиду того, что скрипт может например запускаться и так: ./traffic-spy.sh, если в данный момент я нахожусь в папке /home/services/traffic-spy/
Утилитка basename тоже совершенно не о том :(.

В общем - я искал, честно искал, но найти не смог. Не отправляйте в гугл, пожалуйста.


Содержание

Сообщения в этом обсуждении
"Маленький вопрос про Bash."
Отправлено mezantrop , 01-Ноя-07 13:07 
>[оверквотинг удален]
>Подскажите, плиз, как из скрипта узнать место его расположения?
>Например есть скрипт: /home/services/traffic-spy/traffic-spy.sh
>Хочется узнать его расположение, т.е. - /home/services/traffic-spy/
>
>Использовать $0 невозможно, ввиду того, что скрипт может например запускаться и так:
>./traffic-spy.sh, если в данный момент я нахожусь в папке /home/services/traffic-spy/
>Утилитка basename тоже совершенно не о том :(.
>
>В общем - я искал, честно искал, но найти не смог. Не
>отправляйте в гугл, пожалуйста.

воспользоваться командой pwd :)


"Маленький вопрос про Bash."
Отправлено dev , 01-Ноя-07 13:55 
>Доброго времени суток!
>Подскажите, плиз, как из скрипта узнать место его расположения?
>Например есть скрипт: /home/services/traffic-spy/traffic-spy.sh
>Хочется узнать его расположение, т.е. - /home/services/traffic-spy/
>
>Использовать $0 невозможно, ввиду того, что скрипт может например запускаться и так:
>./traffic-spy.sh, если в данный момент я нахожусь в папке /home/services/traffic-spy/
>Утилитка basename тоже совершенно не о том :(.

А так?

[ "${0%%/*}" ] && a="`pwd`/${0}" || a="$0"
echo $a


"Маленький вопрос про Bash."
Отправлено stakado , 01-Ноя-07 15:47 
>[оверквотинг удален]
>>Хочется узнать его расположение, т.е. - /home/services/traffic-spy/
>>
>>Использовать $0 невозможно, ввиду того, что скрипт может например запускаться и так:
>>./traffic-spy.sh, если в данный момент я нахожусь в папке /home/services/traffic-spy/
>>Утилитка basename тоже совершенно не о том :(.
>
>А так?
>
>[ "${0%%/*}" ] && a="`pwd`/${0}" || a="$0"
>echo $a

Таким образом получается полный путь + название скрипта. Надо получить только путь, просто pwd не подходит, потому как в случае, если мы находимся в папке /home и запускаем скрипт как service/traffic-spy/traffic-spy.sh то pwd выдасть /home. Из этого + $0 можно составить путь, но исходя из последнего поста я понял, что есть более элегантное решение.

Уважаемый dev, можете подсказать как получить только путь? А ещё лучше киньте линк/ман, где можно прочитать о конструкциях типа [ "${0%%/*}" ].


"Маленький вопрос про Bash."
Отправлено newser , 01-Ноя-07 15:50 
>[оверквотинг удален]
>>echo $a
>
>Таким образом получается полный путь + название скрипта. Надо получить только путь,
>просто pwd не подходит, потому как в случае, если мы находимся
>в папке /home и запускаем скрипт как service/traffic-spy/traffic-spy.sh то pwd выдасть
>/home. Из этого + $0 можно составить путь, но исходя из
>последнего поста я понял, что есть более элегантное решение.
>
>Уважаемый dev, можете подсказать как получить только путь? А ещё лучше киньте
>линк/ман, где можно прочитать о конструкциях типа [ "${0%%/*}" ].

man dirname
man bash :)


"Маленький вопрос про Bash."
Отправлено dev , 01-Ноя-07 16:19 
>>[ "${0%%/*}" ] && a="`pwd`/${0}" || a="$0"
>>echo $a
>
>Таким образом получается полный путь + название скрипта.
>Уважаемый dev, можете подсказать как получить только путь? А ещё лучше киньте
>линк/ман, где можно прочитать о конструкциях типа [ "${0%%/*}" ].

Из пути файла получить имя каталог можно стандартными средствами - dirname, как уже сказали.

О [ "${0%%/*}" ]:
1. Открывающая скобка [ это синоним команды test, которая описана в соотв. мане.
2. Конструкция ${0%%/*} относится к типу write-only - ее можно написать но совершенно не возможно понять, что она делает :) В данном случае она отсекает от $0 все, начиная с первого слеша. Т.е. если у нас путь был абсолютный, то строка останется пустой, что и проверяет test, выполняя то, что стоит после && или то, что после ||.

Вкратце: man sh


"Маленький вопрос про Bash."
Отправлено all , 01-Ноя-07 16:45 
>[оверквотинг удален]
>Подскажите, плиз, как из скрипта узнать место его расположения?
>Например есть скрипт: /home/services/traffic-spy/traffic-spy.sh
>Хочется узнать его расположение, т.е. - /home/services/traffic-spy/
>
>Использовать $0 невозможно, ввиду того, что скрипт может например запускаться и так:
>./traffic-spy.sh, если в данный момент я нахожусь в папке /home/services/traffic-spy/
>Утилитка basename тоже совершенно не о том :(.
>
>В общем - я искал, честно искал, но найти не смог. Не
>отправляйте в гугл, пожалуйста.

В bash есть встроенная переменная $PWD, я думаю это то что вам надо...


"Маленький вопрос про Bash."
Отправлено bANAn , 02-Ноя-07 04:16 
>[оверквотинг удален]
>Подскажите, плиз, как из скрипта узнать место его расположения?
>Например есть скрипт: /home/services/traffic-spy/traffic-spy.sh
>Хочется узнать его расположение, т.е. - /home/services/traffic-spy/
>
>Использовать $0 невозможно, ввиду того, что скрипт может например запускаться и так:
>./traffic-spy.sh, если в данный момент я нахожусь в папке /home/services/traffic-spy/
>Утилитка basename тоже совершенно не о том :(.
>
>В общем - я искал, честно искал, но найти не смог. Не
>отправляйте в гугл, пожалуйста.

dirname $0