私はKornシェルで現在のスクリプトへの絶対パスを取得することはできますか?

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

質問

これは、現在、Kornシェル(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

が最後の行に注目してください? $ _を使用します。 Kornシェルでは、少なくとも。 bashでYMMV、CSH、ら、

スクリプトが呼び出された方法は、変数$ 0では保存されています。あなたは絶対ファイル名を取得するためにreadlinkを使用することができます:

readlink -f "$0"

まあ、それは私にしばらく時間がかかったが、この1つは、それは悲鳴とても簡単です。

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

CDは$(と生み出されたシェルで動作するため)には、現在のスクリプトには影響しません。

変数$ 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であり(おそらくMacPortsの経由を除く)はreadlink -fがないので、あなただけの特定のシンボリックリンクファイルの保存先を取得するためにreadlinkを使用することができます。

スクリプト自体がシンボリックリンクの場合は、

$(cd -P ... pwd -P)技術はいいですが、スクリプトのみにつながるディレクトリのリンクを解決するために動作しますが、それは動作しません。

また、言及されなかった1ケース:あなたはシェル(/bin/sh /path/to/myscript.sh)に引数として渡すことで、スクリプトを起動したときには、$0、この場合には使用できません。

私はそれらの多くが実際にあるシェルスクリプト、「バイナリ」をMySQLへ見ていました。そして今、私は彼らが--basedirオプションを求める理由を理解したり、特定の作業ディレクトリから起動する必要があります。対象のスクリプトを見つけるためには良い解決策が存在しないためです。

これは、リンクがいた場合、それは「真」のパスを与えることはありませんが、も動作します。これは、あまり正確な単純だが、。

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

whichコマンドしてみます。

which scriptname

その絶対パスと一緒にあなたのスクリプトの完全修飾名を与えます。

私は絶対パスのシンボリックリンクで、そしてあまりにもリンクのチェーンに対処できるようにするには、エドワードStaudtの答えをアップグレードします。

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