2017-10-01 5 views
1

特定のディレクトリの場所を計算するcliを作成しました。スクリプトを変更したいと思っています。私の最初のアプローチは./myscript | cdでした。私は学んだことが1として動作しません。cdはパイプ引数を取らず、2.スクリプトは親シェルのディレクトリを変更することができません。私のシェル関数がパイプ入力からディレクトリを変更できないのはなぜですか?

私は回避策があることを学んだ、と私は.bash_profileで関数を作成してみました:今./myscript | cdir正しいディレクトリを実行している

function cdir(){ 
    DIR="" 
    while read LINE; do 
     DIR=$LINE 
    done 
    echo $DIR 
    cd $DIR 
} 

が出力され、しかし、ディレクトリがまだ変更されません。

コマンド置換を使用して作業します。cd $(./myscript)ですが、実際にはパイプを使用してこれを書き込むことができます。どのように私はこれを動作させることができるか、または少なくともそれが不可能である理由を説明することができますか?

+2

あなたが関数の最後に 'pwd'はを実行する場合は、ことがわかりますディレクトリ*はスコープ内で変更されました。そのスコープがPOSIXで指定されていないパイプラインの親スコープと一致するかどうか、そしてシェルとシェルの違い(特定のシェルのさまざまな実行時設定間で変化するかどうか - 最後のパイプライン要素を新しいバージョンのbashジョブ制御サポートを無効にした場合のみ)。 –

答えて

3

cdは、プロセスの属性である現在の作業ディレクトリを変更します。パイプラインを使用すると、シェルはサブプロセスを作成し、サブプロセスが終了すると、cd(関数内)の効果が失われます。

cd -- "$(./myscript)" 

が正しい方法です。ここでは、現在のシェルでcdが実行されます。


も参照してください:

+1

Quibble - 'cd - " $(./ myscript) "はおそらくもう少し正確です。 –

+1

ありがとう!したがって、配管自体が新しいプロセスを生み出しています。 –

関連する問題