シェルスクリプトで「ディレクトリの変更」を使用しました(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つの解決策ですが、このスクリプトは現在のシェルの環境を直接変更できることに注意する必要があります。また、引数を渡すこともできなくなりました。
別の方法は、スクリプトをbashの関数として実装することです。
function cdbm() {
cd whereever_you_want_to_go
echo arguments to the functions were $1, $2, ...
}
この手法はオートジャンプで使用されます: http://github.com/joelthelion/autojump/wiki シェルディレクトリブックマークの学習を提供します。
調達することで達成できます。ソーシングは基本的に同じシェルでスクリプトを実行するのに対して、通常の実行(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の後に終了すると、スクリプトはそのディレクトリにとどまります。