シェルスクリプトでのディレクトリ作業ディレクトリの変更

シェルスクリプトでのディレクトリ作業ディレクトリの変更

ディレクトリをシェルスクリプトディレクトリに変更し、それをエコーする単純なシェルスクリプトを作成しようとしています。

スクリプトは次のとおりです。

#!/bin/bash
# cd '/explicit/path/to/script'
cd $(dirname $0)
echo $(dirname $0)

スクリプトディレクトリに明示的なCDを使用しても、出力は常に次のようになります。

/bin

私は何を見逃していますか?

答え1

スクリプトをインポートするのではなく、スクリプトを実行する必要があります。

/path/to/script.sh

(いいえ.)。

走るとき

. /path/to/script.sh

$0現在はシェルであり、おそらく位置があるでしょう/bin(したがって見える動作)。必ずしもそうではなく/bin/bash、スクリプトをインポートするとき shebang は何の効果もありません。

ルーカス' 他の点は有効です。引用符を使用せdirnameずに直接実行する必要がありますecho

答え2

この変数は、$0ユーザーが直接実行するシェルスクリプトを指します。したがって、この内容を含むファイルがある場合

#!/bin/sh
echo "$0"

それをコピーして両方のコピーを実行可能にすると、/bin/my-script~/somewhere/my-script-2の動作を観察できます(私は/binあなたの動作であると仮定します$PATH)。

$ my-script
/bin/my-script
$ ~/somewhere/my-script-2
/home/luc/somewhere/my-script-2
$ cd
$ somewhere/my-script-2
somewhere/my-script-2
$ ../../bin/my-script
../../bin/my-script
$ cd /bin
$ ./my-script
./my-script

など。

インタラクティブシェルで$0実行されているシェルを指すと、存在する可能性が高くなります/bin。したがって、上記のシェルスクリプトを取得すると、常にシェルソルバーのパスが表示されます/bin/bash。これを行うには、両方のスクリプトが実行可能である必要はありません。

$ . my-script
/bin/bash
$ . ~/somewhere/my-script-2
/bin/bash
$ cd
$ . somewhere/my-script-2
/bin/bash
$ . ../../bin/my-script
/bin/bash
$ cd /bin
$ . ./my-script
/bin/bash

その理由は、ソーススクリプトがソーススクリプトと同じプロセスで実行され$0変更されていないためです($@更新されたにもかかわらず)。

dirname "$0"この印刷は、/bin実行中のファイルがにあること、または対話型セッションまたはソーススクリプトで/bin実行されており、dirname使用中のインタプリタが上にあることを意味します/bin

その他:

  • あなたはそれをする必要はなく、同じことをしますecho "$(dirname "$0")"dirname "$0"
  • 使用pwdget現在のタスクリスト。
  • 引用符$0とコマンド置換を追加します。そうしないと、問題が発生する可能性があります。cd $(echo a b c)問題を確認するには、同様のことを試してください。

関連情報