シェルスクリプトで「CD」を実行し、スクリプトが終了した後にそこにとどまる方法は?
質問
シェルスクリプト(bash)で「ディレクトリの変更」を使用しました
#!/bin/bash
alias mycd='cd some_place'
mycd
pwd
pwd
プリント some_place
正しく、しかしスクリプトが終了した後、現在の作業ディレクトリは変更されません。
スクリプトごとにパスを変更することは可能ですか?
解決
ファイルを次のように調達する必要があります。
. myfile.sh
また
source myfile.sh
調達せずに、サブシェルで変更が発生し、スクリプトを呼び出している親シェルではありません。ただし、ファイルを調達すると、ファイル内の行がコマンドラインで入力されているかのように実行されます。
他のヒント
スクリプトは別のサブシェルで実行されます。そのサブシェルは、あなたがそれを実行するシェルではなく、ディレクトリを変更することです。 source
スクリプトを実行する代わりに:
# Bash
source yourscript.sh
# or POSIX sh
. yourscript.sh
実行するスクリプトを調達することは1つのソリューションです。このスクリプトは、現在のシェルの環境を直接変更できることに注意する必要があります。また、もう引数を渡すことはできません。
もう1つの方法は、スクリプトをBashの関数として実装することです。
function cdbm() {
cd whereever_you_want_to_go
echo arguments to the functions were $1, $2, ...
}
この手法は、AutoJumpによって使用されます。http://github.com/joelthelion/autojump/wikiLearning Shell Directoryのブックマークを提供します。
調達することで実現できます。ソーシングは基本的に同じシェルでスクリプトを実行しますが、通常の実行(通常の実行)sh test.sh
また ./test.sh
)サブシェルを作成し、そこでスクリプトを実行します。
test.sh
cd development/
ls
# Do whatever you want.
実行する test.sh
に
source test.sh
.
の最短表記です source
. 。したがって、できることもできます
. test.sh
これにより、スクリプトが実行され、現在のシェルのディレクトリが変更されます development/
.
ログインシェルでスクリプトを実行するたびに、新しいサブプロセスが生成され、スクリプトの実行がサブシェルで実行されます。スクリプトが完了すると、サブシェルが終了し、ログインシェルに返されます。スクリプト、ディレクトリはCDで指定されたパスに変更されますが、スクリプトが終了するまでにログインシェルに戻って、スクリプトを開始した場所からワーキングディレクトリに戻ります。
これを克服する方法は使用です、
source yourscript.sh
ソースが行うことは、スクリプトをTCLスクリプトとして実行することです。つまり、ログインシェルのコマンドラインに各行を入力し、そこから実行した場合と同じ効果があります。このようにして、スクリプトがCDの後に終了すると、そのディレクトリにとどまります。