Linuxがリダイレクト演算子を処理する方法は少し混乱しています。
私のホームディレクトリには1つのファイルしかありません。
andy$: ls
demo.mp4
ls
出力をファイルに送信すると、そのdemo.mp4
ファイル以外のディレクトリには何もないため、そのファイルからのみ出力を表示できます。
andy$: ls > myfile
しかし、私は実際にmyfile
包含自体を発見しました!
andy$ cat myfile
demo.mp4
myfile <-- ???
だからls
処刑されるという意味ですね後ろに創造myfile
?
それは次のとおりです。
- 作る
myfile
- ディレクトリの内容の一覧表示
ls
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