私はbashスクリプトを書いています。現在の作業ディレクトリは、常にスクリプトが置かれているディレクトリにする必要があります。
デフォルトの動作では、スクリプト内の現在の作業ディレクトリは、実行元のシェルのものですが、この動作は望ましくありません。
#!/bin/bash
cd "$(dirname "$0")"
次の簡単なワンライナーを試してください。
すべてのUNIX/OSX/Linuxの場合
dir=$(cd -P -- "$(dirname -- "$0")" && pwd -P)
注:コマンドの終わりを示すためにコマンドで二重ダッシュ( - )が使用されているため、ダッシュやその他の特殊文字を含むファイルはコマンドを中断しません。
Linux、Mac、その他* BSDの場合:
cd "$(dirname "$(realpath "$0")")";
注:realpath
はデフォルトで(Ubuntuのように)最も普及しているLinuxディストリビューションにインストールされるべきですが、いくつかのものでは欠けている可能性があるので、インストールする必要があります。
そうでなければ、そのようなことを試すことができます(それは最初の既存のツールを使用します)
cd "$(dirname "$(readlink -f "$0" || realpath "$0")")"
Linux固有の場合:
cd "$(dirname "$(readlink -f "$0")")"
* BSD/MacでGNU readlinkを使用する:
cd "$(dirname "$(greadlink -f "$0")")"
注:coreutils
をインストールする必要があります(例:1. Install Homebrew 、2. brew install coreutils
)。
bashで
Bashでは、 パラメータ展開 を使用してそれを実現できます。
cd "${0%/*}"
しかし、スクリプトが同じディレクトリから実行されている場合は機能しません。
あるいは、bashで以下の関数を定義することができます。
realpath () {
[[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"
}
この関数は1つの引数を取ります。引数がすでに絶対パスを持っている場合は、それをそのまま出力します。それ以外の場合は、変数$PWD
変数+ファイル名引数を出力します(接頭辞./
なし)。
debianの.bashrc
ファイルから取ったバージョンです。
function realpath()
{
f=$@
if [ -d "$f" ]; then
base=""
dir="$f"
else
base="/$(basename "$f")"
dir=$(dirname "$f")
fi
dir=$(cd "$dir" && /bin/pwd)
echo "$dir$base"
}
関連する
また見なさい:
cd "$(dirname "${BASH_SOURCE[0]}")"
それは簡単です。できます。
受け入れられた答えは、$PATH
のように他の場所にシンボリックリンクされていないスクリプトにはうまくいきます。
#!/bin/bash
cd "$(dirname "$0")"
ただし、スクリプトがシンボリックリンクを介して実行されている場合は、
ln -sv ~/project/script.sh ~/bin/;
~/bin/script.sh
これは~/bin/
ディレクトリではなく、~/project/
ディレクトリに移動します。cd
の目的が~/project/
に対する依存関係を含めることである場合、おそらくスクリプトを壊します。
シンボリックリンクの安全な答えは以下の通りです。
#!/bin/bash
cd "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")"
シンボリックリンクの可能性があるファイルの絶対パスを解決するにはreadlink -f
が必要です。
引用符は、空白を含む可能性があるファイルパスをサポートするために必要です(不適切な方法ですが、これが当てはまらないと想定するのは安全ではありません)。
このスクリプトは私にはうまくいくようです。
#!/bin/bash
mypath=`realpath $0`
cd `dirname $mypath`
pwd
Pwdコマンドラインは、どこから実行しても、スクリプトの場所を現在の作業ディレクトリとして表示します。
スクリプトへの実際のパスを取得する
if [ -L $0 ] ; then
ME=$(readlink $0)
else
ME=$0
fi
DIR=$(dirname $ME)
(これは私の同じ質問に対する答えです: スクリプトが実行されるディレクトリの名前を取得します )
cd "`dirname $(readlink -f ${0})`"