dirname
コマンドは、単にのオフファイル名にパスを解析し、最も基本的なものです$0
(スクリプト名)変数:
dirname "$0"
しかし、matt bが指摘したように、返されるパスはスクリプトの呼び出し方法によって異なります。pwd
は、現在のディレクトリが何であるかを通知するだけで、スクリプトが存在するディレクトリを通知しないため、ジョブを実行しません。さらに、スクリプトへのシンボリックリンクが実行されると、(おそらく相対)パスが取得されます。実際のスクリプトではなく、リンクが存在する場所。
他の何人かはreadlink
コマンドに言及しましたが、最も簡単には、以下を使用できます。
dirname "$(readlink -f "$0")"
readlink
スクリプトパスをファイルシステムのルートからの絶対パスに解決します。したがって、シングルまたはダブルのドット、チルド、および/またはシンボリックリンクを含むパスは、フルパスに解決されます。
これらはそれぞれを示すスクリプトwhatdir.sh
です。
#!/bin/bash
echo "pwd: `pwd`"
echo "\$0: $0"
echo "basename: `basename $0`"
echo "dirname: `dirname $0`"
echo "dirname/readlink: $(dirname $(readlink -f $0))"
相対パスを使用して、私のホームディレクトリでこのスクリプトを実行します。
>>>$ ./whatdir.sh
pwd: /Users/phatblat
$0: ./whatdir.sh
basename: whatdir.sh
dirname: .
dirname/readlink: /Users/phatblat
繰り返しますが、スクリプトへの完全パスを使用します。
>>>$ /Users/phatblat/whatdir.sh
pwd: /Users/phatblat
$0: /Users/phatblat/whatdir.sh
basename: whatdir.sh
dirname: /Users/phatblat
dirname/readlink: /Users/phatblat
現在ディレクトリを変更しています:
>>>$ cd /tmp
>>>$ ~/whatdir.sh
pwd: /tmp
$0: /Users/phatblat/whatdir.sh
basename: whatdir.sh
dirname: /Users/phatblat
dirname/readlink: /Users/phatblat
最後に、シンボリックリンクを使用してスクリプトを実行します。
>>>$ ln -s ~/whatdir.sh whatdirlink.sh
>>>$ ./whatdirlink.sh
pwd: /tmp
$0: ./whatdirlink.sh
basename: whatdirlink.sh
dirname: .
dirname/readlink: /Users/phatblat
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd && echo x)"
なしで削除しDIR="${DIR%x}"
ます。