IOリダイレクト演算子はいつ実行されますか?

IOリダイレクト演算子はいつ実行されますか?

Linuxがリダイレクト演算子を処理する方法は少し混乱しています。

私のホームディレクトリには1つのファイルしかありません。

andy$: ls
demo.mp4

ls出力をファイルに送信すると、そのdemo.mp4ファイル以外のディレクトリには何もないため、そのファイルからのみ出力を表示できます。

andy$: ls > myfile

しかし、私は実際にmyfile包含自体を発見しました!

andy$ cat myfile
demo.mp4
myfile <-- ???

だからls処刑されるという意味ですね後ろに創造myfile

それは次のとおりです。

  1. 作るmyfile
  2. ディレクトリの内容の一覧表示ls
  3. myfile現在存在する内容をmyfileファイルに書き込みます。

したがって、リダイレクトするファイルを除外する必要がある場合は、次のことを行う必要があります。

ls | grep -v "myfile" > myfile

まず、私の言葉は正しいですか?

もしそうなら、なぜ?これに関する詳細情報はどこにありますか?

答え1

はい、そうです。

シェルはコマンドを実行する前にリダイレクトを実行します。シェルがコマンドを実行するときに、必要に応じて新しいコマンドの標準入力、出力、およびエラーを設定します。デフォルトでは、端末(またはシェルが接続されているすべての項目)に接続されます。リダイレクトが存在すると、対応するファイル記述子が対応するファイル(またはパイプなど)に接続されます。バッファリングなどはありません。したがって、シェルはプログラムの出力を蓄積せず、それからファイルに書き込み、プログラムの出力をファイルにリンクし、すべてを処理します。

これは、コマンドを実行する前にファイルを開く必要があることを意味します。

これについての詳細は、以下で確認できます。シェル言語に関するPOSIX章。最初のセクションには、コマンドを実行する前にシェルが実行する一連のアクションがリストされており、コマンドが実行される前にリダイレクトが発生することがわかります。

答え2

ls開いたファイルはstdoutで始まるので、lsプログラムが実行される前にファイルを生成する必要があります。

詳細については、シェルのPOSIX標準を確認してください。http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sh.html

そして、シェルコマンド言語の説明は次のとおりです。http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18

関連情報