4

現在、私は小さなシェル (リダイレクト、パイプ、exec など) をコーディングしています。Linux シェルが I/O リダイレクションに対処する際に実行する手順を理解しようとしています。

私が助けを必要とするものに関するいくつかの質問:

  1. リダイレクトを探すときに、シェルはコマンドラインからどの方向に読み取りますか? 左から右か、逆か?再帰を使用しますか?

  2. シェルが探す必要のあるケースは何ですか? (多くのバリエーションを含むことができるものがたくさんあるのか、それともカップルだけなのかはわかりません)

とにかく、私が考えることができるいくつかは次のとおりです(間違っている場合は修正してください):

cmd > file1       # stdout of cmd goes to file

cmd file1 > file2 # stdout of cmd with file1 as an argument goes to file2

cmd file2 < file1 # stdin on file2 comes from file1

現在、次のケースのプロセスがわかりません(シェルがこれらをどのように検索して処理するかなど)。シェルが実行する手順は私にはわかりません

cmd file2 > file3  < file1 # using "tee" in place of "cmd" I don't know
                           # how to do the dups and when to exec

cmd file2 < file3 > file1  # same ^
4

1 に答える 1

5

stdin と stdout のみをリダイレクトする限り、リダイレクトが処理される順序は重要ではないため、最後の 2 つの例はまったく同じです。

BASH は IO リダイレクトを左から右に処理します。

> cmd1 > file 2>&1
> cmd2 2>&1 > file

この二つは違います。最初のケースでは、stdout をバインドしfile、次に stderr を stdout にバインドします。stderr と stdout の両方がファイルに入ります。

2 番目のケースでは、(子の) stderr を (親の) stdout にバインドしてから、ファイルへの子の stdout を見つけます。その結果、stdout で子の stderr 出力を取得し、stdout がファイルに出力されます。これは、たとえば、パイプで stderr を処理する場合に役立ちます。

BASH のソース コードを見ると、コマンドの実行がいくつかのステップに分かれていることがわかります。

  • すべての変数を置き換える
  • 入力を「単語」に分割する
  • プロセス IO リダイレクト (および関連する単語を削除)
  • 正しい IO 設定と残りの単語を引数として使用して、新しい子プロセスを作成します。
于 2013-11-26T11:17:52.713 に答える