私はKornシェルで現在のスクリプトへの絶対パスを取得することはできますか?
質問
これは、現在、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)