シェルスクリプトで「CD」を実行し、スクリプトが終了した後にそこにとどまる方法は?

StackOverflow https://stackoverflow.com/questions/3879431

  •  28-09-2019
  •  | 
  •  

質問

シェルスクリプト(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の後に終了すると、そのディレクトリにとどまります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top