Возможно ли, что исходный сценарий оболочки знает свое местоположение? Я прочитал определение пути к соерседу сценарию оболочки , но ответы сосредоточиться на bash
и tcsh
и потерпеть неудачу , если используется POSIX оболочка. $0
также не является решением и дает неправильные результаты .
Решение не должно быть на 100% надежным. Маловероятно, что путь содержит жесткие или символические ссылки.
# sourcing the script should yield the absolute path to the script
. somedir/thescript
# within “thescript”
-> /tmp/foo/bar/somedir
Немного предыстории: сценарий является частью существующего приложения, содержащего десятки двоичных файлов в bin
каталоге в известном месте (зависит от архитектуры) относительно исходного сценария. Чтобы использовать приложение, пользователь создает сценарий, который добавляет bin
каталог в каталог PATH
, поэтому двоичные файлы приложения могут быть легко вызваны в текущей оболочке (какой бы она ни была).
. /path/to/script
таких какMARCO_DIR=/path/to; . $MARCO_DIR/script
илиeval "$(/path/to/script)"
? @RahulPatilBASH_SOURCE
явно относится к bash.Ответы:
Расположение исходного сценария недоступно, если вы не используете оболочку, которая предлагает расширения для спецификации POSIX. Вы можете проверить это с помощью следующего фрагмента:
где
included.sh
содержитсяВ bash имя исходного сценария находится в
$BASH_SOURCE
. В zsh (в режиме совместимости с zsh, а не в режиме совместимости с sh или ksh) он находится в$0
(обратите внимание, что в$0
функции вместо этого используется имя функции). В pdksh и dash он недоступен. В ksh93 этот метод не раскрывает решение, но полный путь к включенному сценарию доступен как${.sh.file}
.Если вам требуется bash, ksh93 или zsh, вы можете использовать этот фрагмент:
Вы можете попытаться угадать местоположение скрипта, посмотрев, какие файлы открыта оболочкой. Экспериментально это работает с dash и pdksh, но не с bash или ksh93, которые, по крайней мере для короткого скрипта, закрыли файл скрипта к тому времени, когда им удалось его выполнить.
Сценарий может не являться файлом с дескриптором с наибольшим номером, если сценарий получен из сложного сценария, который воспроизводит перенаправления. Вы можете циклически просматривать открытые файлы. Это не гарантировано работать в любом случае. Единственный надежный способ найти исходный скрипт - это использовать bash, ksh93 или zsh.
Если вы можете изменить интерфейс, то вместо того, чтобы использовать свой сценарий, пусть ваш сценарий распечатает фрагмент оболочки, который будет передан
eval
вызывающей стороне. Это то, что обычно делают скрипты для установки переменных среды. Это позволяет вашему сценарию быть написанным независимо от капризов оболочки вызывающего абонента и конфигурации оболочки.В звонилке:
eval "`/path/to/setenv`"
источник
Добавив к ответу Жиля, вы МОЖЕТЕ получить сценарий оболочки (
if $0 = ash
) через/proc/$$ interface
. Я не знаю, насколько это точно, но,/proc/$$/fd/11
кажется, всегда указывает на this_script с пеплом BusyBox.Предоставляя это как потенциальный ответ тем, кто сталкивался с этой страницей (как я сделал).
Последний ответ был удален - так что мои претензии к этой работе проверены на 4 разных платформах HW (x86, ARM, XLP и powerpc). Все дают один и тот же ответ FD / 11. Ссылка на чтение из
/proc/$$/fd/11
приводит к моему сценарию.Энди
источник