質問

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 が実行されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top