2016-09-02 8 views
3

シェル(学校プロジェクト)に取り組んでいます。私たちは行動を理解していません。 リダイレクト時に組み込み関数が動作しないのはなぜですか?シェル組み込みリダイレクト

cd - | command 

よう

は、ディレクトリを変更しません。

または

export NAME=VALUE | command 

は、変数を作成しません。

ありがとうございます。

答えて

3

パイプラインのリンクは、分岐したサブシェルで実行されます。 bashで

、あなたは$ BASHPIDと、現在のプロセスのPIDを印刷することができ、そのような何か:真ん中の2つのPIDがあることで

12849 
12851 
12852 
12849 

self(){ echo $BASHPID; } ; self ; self >&2 | self; self 

はあなたのような何かを与える必要があります最初と最後のもの(マザー・シェル)とは異なります(いくつかのシェルでは、最初または最後のリンクはマザー・シェルで実行されますが、bashでは実行されません)。

サブシェルで現在のディレクトリを変更したり、値をエクスポートしても、親シェルには何ら影響しません。

+1

ご理解いただきありがとうございます。 chdirは呼び出し元のプロセスに対してのみ機能します。 –

0

あなたは混乱していると思います。 '|'セミコロンで ';'ツールチェーンを構築するときパイプはあるコマンドのstdoutを別のコマンドのstdoutに渡すためのものです。 セミコロンは、同じシェルで別のコマンドを実行するためのものです。

したがってその内容をいくつかのディレクトリを入力してリストアップするために、あなたはこれを行う必要があります:パイプラインのすべてのプロセスが適切にその流れで、サブシェルで同時に開始されている通常のLinuxに

cd somedir; ls

スケジューラは、マシン上で実行されている他のすべてのプロセスとともに、接続され、管理されます。それらの出力はバッファを介して再接続され、同期されます

その理由は、変数が子供のサブシェルにとどまっていたためにexportコマンドの変更が表示されないためです。

関連する問題