web-dev-qa-db-ja.com

シェルスクリプトで「cd」を実行し、スクリプトの終了後もそこにとどまる方法

シェルスクリプトで「ディレクトリの変更」を使用しました(bash)

#!/bin/bash
alias mycd='cd some_place'
mycd
pwd

pwd印刷some_placeは正しくなりますが、スクリプトが終了した後、現在の作業ディレクトリは変わりません。

スクリプトでパスを変更することはできますか?

65
qrtt1

次のようにファイルをソースする必要があります。

. myfile.sh

または

source myfile.sh

ソースを作成しないと、スクリプトを呼び出している親シェルではなく、サブシェルで変更が発生します。ただし、ファイルのソースを指定すると、ファイル内の行はコマンドラインで入力されたように実行されます。

79
codaddict

スクリプトは別のサブシェルで実行されます。そのサブシェルは、実行するシェルではなくディレクトリを変更します。可能な解決策は、スクリプトを実行する代わりにsourceすることです。

# Bash
source yourscript.sh
# or POSIX sh
. yourscript.sh
15
schot

実行するスクリプトを入手することは1つの解決策ですが、このスクリプトは現在のシェルの環境を直接変更できることに注意する必要があります。また、引数を渡すこともできなくなりました。

別の方法は、スクリプトをbashの関数として実装することです。

function cdbm() {
    cd whereever_you_want_to_go
     echo arguments to the functions were $1, $2, ...
}

この手法はオートジャンプで使用されます: http://github.com/joelthelion/autojump/wiki シェルディレクトリブックマークの学習を提供します。

13
thomasd

調達することで達成できます。ソーシングは基本的に同じシェルでスクリプトを実行するのに対して、通常の実行(sh test.shまたは./test.sh)はサブシェルを作成し、そこでスクリプトを実行します。

test.sh

cd development/
ls
# Do whatever you want.

test.shを実行

source test.sh

.は、sourceの最短表記です。だからあなたもすることができます

. test.sh

これにより、スクリプトが実行され、現在のシェルのディレクトリがdevelopment/に変更されます。

3
Fizer Khan

ログインシェルでスクリプトを実行するたびに、新しいサブプロセスが生成され、スクリプトの実行はサブシェルで行われます。スクリプトが完了すると、サブシェルが終了し、ログインシェルに戻ります。スクリプト、ディレクトリはcdで指定されたパスに変更されますが、スクリプトが終了するまでに、スクリプトを開始した作業ディレクトリへのログインシェルに戻ります。

これを克服する方法は使用です

source yourscript.sh

ソースは、スクリプトをTCLスクリプトとして実行します。つまり、ログインシェルのコマンドラインで各行を入力し、そこから実行した場合と同じ効果があります。このように、スクリプトがcdの後に終了すると、スクリプトはそのディレクトリにとどまります。

1
dig_123