web-dev-qa-db-ja.com

現在の作業ディレクトリをスクリプトのディレクトリに設定する方法

私はbashスクリプトを書いています。現在の作業ディレクトリは、常にスクリプトが置かれているディレクトリにする必要があります。

デフォルトの動作では、スクリプト内の現在の作業ディレクトリは、実行元のシェルのものですが、この動作は望ましくありません。

436
jameshfisher
#!/bin/bash
cd "$(dirname "$0")"
507
ndim

以下も動作します。

cd "${0%/*}"

構文は this StackOverflow answerに詳しく説明されています。

286
Paul Schulz

次の簡単なワンライナーを試してください。


すべての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"
}

関連する

また見なさい:

Mac上でGNUのreadlink -fの動作を取得する方法を教えてください。

152
kenorb
cd "$(dirname "${BASH_SOURCE[0]}")"

それは簡単です。できます。

58
Dan Moulding

受け入れられた答えは、$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が必要です。

引用符は、空白を含む可能性があるファイルパスをサポートするために必要です(不適切な方法ですが、これが当てはまらないと想定するのは安全ではありません)。

4
James McGuigan

このスクリプトは私にはうまくいくようです。

#!/bin/bash
mypath=`realpath $0`
cd `dirname $mypath`
pwd

Pwdコマンドラインは、どこから実行しても、スクリプトの場所を現在の作業ディレクトリとして表示します。

2
Amardeep AC9MF

スクリプトへの実際のパスを取得する

if [ -L $0 ] ; then
    ME=$(readlink $0)
else
    ME=$0
fi
DIR=$(dirname $ME)

(これは私の同じ質問に対する答えです: スクリプトが実行されるディレクトリの名前を取得します

1
rodnower
cd "`dirname $(readlink -f ${0})`"
1
user742030