0

シェルを実装しようとしていますが、複数のパイプを除いて、すべてが完全に正常に機能しています。つまりls -l -a -F | tr [a-z] [A-Z] | sort、これにどのようにアプローチできますか?これを解決するには複数のパイプを作成する必要があることはわかっていますが、正確にはどうすればよいですか? 誰かが私を正しい方向に導くことができますか?

現在、パイプは 1 つしか管理していませんが、パイプが 2 つ以上ある場合にこれにアプローチする方法がよくわかりません。この問題に対処する方法を誰かが疑似コードを提供してくれるかどうか疑問に思っていました

4

2 に答える 2

2

文字列を順番に解析するだけです。パイプ記号に到達したら、最後のコマンドをフォークして、std in と std out を保存します。以前のコマンドがあった場合は、そのコマンド std を新しいコマンドの std in にポンプします。次に、ループします。


追記:

唯一の違いは

A)    thing1 > thing2

B)    thing1 | thing2

これは、A) では、thing1 を (フォークで) 実行し、出力を thing2 というファイルに設定しています。

B) では、thing1 と thing2 の両方を fork で実行し、thing1 の出力を thing2 の入力に設定しています。

そう、

C)     thing1 | thing2 | thing3

まったく同じです。thing1、thing2、thing3 を実行 (フォーク) し、thing1 の出力を thing2 の入力に、thing2 の出力を thing3 の入力に設定する必要があります。

パイプは同じように機能>しますが、フォークで「ターゲット」を実行します。

于 2013-11-13T18:48:01.103 に答える
0

複数のパイプを除いてすべてが機能している場合は、グループ化またはサブシェルを使用してそれらを単一のパイプに減らすことができます。

{ ls -l -a -F | tr a-z A-Z; } | sort
(ls -l -a -F | tr a-z A-Z) | sort
于 2013-11-14T07:45:55.520 に答える