Могу ли я получить абсолютный путь к текущему скрипту в KornShell?

StackOverflow https://stackoverflow.com/questions/760110

Вопрос

Можно ли узнать полный путь к скрипту, который в данный момент выполняется в KornShell (ksh)?

т. е.если мой сценарий находится в /opt/scripts/myscript.ksh, могу ли я программно внутри этого скрипта обнаружить /opt/scripts/myscript.ksh ?

Спасибо,

Это было полезно?

Решение

Вы можете использовать:

## __SCRIPTNAME - name of the script without the path
##
typeset -r __SCRIPTNAME="${0##*/}"

## __SCRIPTDIR - path of the script (as entered by the user!)
##
__SCRIPTDIR="${0%/*}"

## __REAL_SCRIPTDIR - path of the script (real path, maybe a link)
##
__REAL_SCRIPTDIR=$( cd -P -- "$(dirname -- "$(command -v -- "$0")")" && pwd -P )

Другие советы

В оболочке korn все эти решения стоимостью 0 долларов терпят неудачу, если вы используете рассматриваемый сценарий.Правильный способ получить то, что вы хотите, — использовать $_

$ cat bar

echo dollar under is $_
echo dollar zero is $0

$ ./bar

dollar under is ./bar
dollar zero is ./bar

$ . ./bar
dollar under is bar
dollar zero is -ksh

Обратите внимание на последнюю строку?Используйте $_.По крайней мере в Корне.YMMV в bash, csh и др..

То, как был вызван скрипт, хранится в переменной $0.Вы можете использовать readlink чтобы получить абсолютное имя файла:

readlink -f "$0"

Ну, это заняло у меня некоторое время, но это настолько просто, что просто кричит.

_SCRIPTDIR=$(cd $(dirname $0);echo $PWD)

поскольку компакт-диск работает в порожденной оболочке с помощью $(), это не влияет на текущий скрипт.

Переменная $RPATH содержит относительный путь к реальному файлу или реальный путь к реальному файлу.

CURPATH=$( cd -P -- "$(dirname -- "$(command -v -- "$0")")" && pwd -P )

CURLOC=$CURPATH/`basename $0`

if [ `ls -dl $CURLOC |grep -c "^l" 2>/dev/null` -ne 0 ];then

    ROFFSET=`ls -ld $CURLOC|cut -d ">" -f2 2>/dev/null`

    RPATH=`ls -ld $CURLOC/$ROFFSET 2>/dev/null`

else

    RPATH=$CURLOC

fi

echo $RPATH

Вот что я сделал:

if [[ $0 != "/"* ]]; then
  DIR=`pwd`/`dirname $0`
else
  DIR=`dirname $0`
fi

readlink -f было бы лучше, если бы он был переносимым, потому что он разрешает все найденные ссылки как для каталогов, так и для файлов.

В Mac os x такого нет readlink -f (за исключением, возможно, macports), так что вы можете использовать только readlink чтобы получить назначение определенного файла символической ссылки.

Тот Самый $(cd -P ... pwd -P) техника хороша, но работает только для разрешения ссылок для каталогов, ведущих к скрипту, она не работает, если сам скрипт является символической ссылкой

Кроме того, один случай, который не был упомянут :когда вы запускаете скрипт, передавая его в качестве аргумента командной строке (/bin/sh /path/to/myscript.sh), $0 в этом случае его нельзя использовать

Я взглянул на "двоичные файлы" mysql, многие из них на самом деле являются сценариями оболочки ;и теперь я понимаю, почему они просят --basedir опция или ее необходимо запустить из определенного рабочего каталога ;это происходит потому, что нет хорошего решения для поиска целевого скрипта

Это тоже работает, хотя и не даст «истинный» путь, если это ссылка.Это проще, но менее точно.

SCRIPT_PATH="$(whence ${0})"

Попробуйте какую команду.

which scriptname

предоставит вам полное имя скрипта вместе с его абсолютным путем.

Я обновил ответ Эдварда Штаудта, чтобы иметь возможность работать с символическими ссылками с абсолютным путем, а также с цепочками ссылок.

DZERO=$0
while true; do
  echo "Trying to find real dir for script $DZERO"
  CPATH=$( cd -P -- "$(dirname -- "$(command -v -- "$DZERO")")" && pwd -P )
  CFILE=$CPATH/`basename $DZERO`
  if [ `ls -dl $CFILE | grep -c "^l" 2>/dev/null` -eq 0 ];then
    break
  fi
  LNKTO=`ls -ld $CFILE | cut -d ">" -f2 | tr -d " " 2>/dev/null`
  DZERO=`cd $CPATH ; command -v $LNKTO`
done

Некрасиво, но работает...После запуска путь будет $CPATH, а файл — $CFILE.

Использование $_ обеспечивает последнюю команду.

>source my_script

Работает, если я даю команду дважды:

>source my_script
>source my_script

Если я использую другую последовательность команд:

>who
>source my_script

Переменная $_ возвращает «кто»

Попробуйте использовать это:

dir = $(dirname $0)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top