2012-02-06 12 views
0

サブシェルから親シェルのディレクトリを変更するために使用できるメカニズムがあるのでしょうか?たとえば、私はスクリプト$ "settings.sh"を$ HOMEに実行しています。 My $ HOMEには$ HOME/TEST /ディレクトリがあります。私「settings.sh」スクリプトは親シェルのディレクトリを変更する

#!/bin/bash 

    # some shell related code 
    # some shell related code 

    cd $HOME/TEST/run 

    exit 0 

以下のようであるならば、私は$ HOMEで、コマンドプロンプトで上記のスクリプトを実行します。実行後、ディレクトリ$ HOME/TEST /にコマンドプロンプトが表示されます。私はサブシェルで$ HOME/TEST/runにcdされているが、実行の終わりには$ HOMEに戻っていることを理解している。

単一のスクリプトを使用して上記を実行する上品な方法はありますか。 一つの方法は、別のスクリプトを生成し、を使用するスクリプト「settings.sh」を修正することである「$ HOME/generatedScript.sh」

+0

私は答えた前に、私はあなたの質問の下の部分を見逃している必要があります。なぜあなたは別のスクリプトを "生成"する必要がありますか? settings.shスクリプトに必要なものを入れてそれを調達するのは間違っていますか? – jordanm

+0

スクリプトの本文は、スクリプト "settings.sh"に対してのみ必要な特定のアプリケーションを実行するための$ PATHを変更します。親シェルで$ PATHが影響を受けるのは嫌です。 – Mike

答えて

5

いや、あなたがすることはできません。それは設計によるものです。親プロセスは、影響を受けたくない子の結果に影響されるべきではありません(そうでなければ、サブシェルは親に対してあらゆる種類の厄介なことをする可能性があります)。

あなたができることは、ファイルに情報を保存したり、ディレクトリを印刷したりすることです。親が望む場合、少なくとも親を使ってディレクトリを変更することができます。

2

Wes Hardakerは、なぜこのスクリプトを実行しても親シェルのディレクトリを変更しない理由を説明しました。そのタイプの問題を回避するには、スクリプトを実行する代わりに、そのスクリプトを "生成"する必要があります。これにより、スクリプト内のコマンドは、子プロセスではなく現在のシェルで実行されます。

. ./settings.sh 

最初の "。"指定されたファイルを "ソース"するようシェルに指示するコマンドです。以下は、help .の文書です:

。:からの文書です。 filename [arguments] 現在のシェル内のファイルからコマンドを実行します。

Read and execute commands from FILENAME in the current shell. The 
entries in $PATH are used to find the directory containing FILENAME. 
If any ARGUMENTS are supplied, they become the positional parameters 
when FILENAME is executed. 

Exit Status: 
Returns the status of the last command executed in FILENAME; fails if 
FILENAME cannot be read. 
関連する問題