存在しないファイルのシェルリダイレクトを理解する
-
07-07-2019 - |
質問
ls > ls.out
これには、リストにls.outも含まれます。 私の理解は:> (シェル出力リダイレクト演算子は、ファイルがまだ存在しない場合(STDOUTを取得するために)最初にファイルを作成し、lsコマンドが再生され、作成したばかりのls.outファイルを出力に含めます。 これは正しいです?そうでない場合は、そのコマンドの動作を詳しく説明してください。
同様に
wc temp > temp
作成した一時ファイル内に0 0 0 tempを出力します。
このシェルの動作は興味深いものです。実際にどのように機能しているのでしょうか。ところで、どちらもUnixプログラミング環境ブックの演習です。上記の答えを述べたように、専門家に私の理解を正してもらいたい。
解決
>
を使用して標準出力をリダイレクトする場合、シェルは、ファイルが存在しない場合、ファイルを(空のファイルとして)作成します。さらに、そのファイルは、シェルが分岐して実行されるコマンドを実行する前に開かれます。 wc temp>を実行するとtemp
、シェルは書き込み用にファイルを開き、 wc
をフォークして実行し、開いているファイルハンドルをプロセスで渡します。
他のヒント
単純化:
ls
は、リダイレクトによって作成されたiノード(ディレクトリエントリ)を見ています。
wc
は、リダイレクションが作成したiノードを見ることができますが、コンテンツを見ると、( wc
)はまだ書き込みを行っていないため空です。
編集:
最初に、どちらの場合でも、リダイレクト(> ls.out
または> temp
)は空のファイルを作成します。ディレクトリ内のエントリ(inode)は、ファイルの場所を指すように作成され、ファイルに関する情報が含まれています。 inodes のウィキペディアの記事を参照してください。
次に、 ls
の場合、ディレクトリ内のすべてのエントリ(作成されたばかりの ls.out
を含む) 、 stdout
(この場合は ls.out
のコンテンツになります)に読み書きされます。
または、 wc
の場合、最近作成された temp
という名前のファイルの改行、単語、およびバイト数をカウントしています空ですゼロカウントをファイルに書き込む(カウントした後)(何もしない)。
ファイルの内容( temp
または ls.out
)は、すべての読み取りが完了するまで書き込まれないため、含めることはできません。
ls
と wc
の動作をより良い方法で比較するには、このコマンドを試してください( ls.out
は存在しません):
ls -l > ls.out
ls.out
のファイルサイズは、内部に含まれるリスト( cat ls.out
)に従ってゼロであることがわかりますが、 ls -l ls.out
でゼロではないことがわかります。これは、 wc
で発生していることに対応しています。
考慮 wc -l temp> temp
temp
がすでに存在し、上記のコマンドを実行した後でも cat temp
の結果がまだ20行である場合、0 tempになります。
これは、 temp
が存在する場合でもシェルが新しい空の temp
を作成し、既存のtempを上書きするため、 wc
が試行するためだと思います temp
の行数をカウントするにはゼロになります。
実質的に> temp
は最初にシェルによって実行され、次に wc -l temp
が実行されます。