1

以下のコマンドで説明してください:

touch temp.txt
touch temp1.txt
who > temp.txt &
cat temp.txt | wc -l >temp1.txt  &

temp.txt ファイルについて言うと、空のファイルです。したがって、実行後にファイルに表示されるものは何temp.txtですかtemp1.txt

ジョブはバックグラウンド モードで実行されているため、考えられるケースを誰か説明してもらえますか?

4

2 に答える 2

0

temp.txtwhen catis runの状態は制御できません (スケジューラー whencatwhorun が相互に関連している) ため、何が起こるかを予測することはできません。より安全なバージョンは

# These two commands are unnecessary. The files will be created
# when opened for writing.
# touch temp.txt
# touch temp1.txt
who | tee temp.txt | wc -l > temp1.txt &  # If it really needs to run in the background
于 2013-07-25T15:04:14.503 に答える
0

場合によります。 cat(1)入力ファイルに何かが表示されるか、何も表示されない場合があります。

これは、最後の 2 つのコマンドで何が起こっているかを大まかに示したものです。touch(1)(呼び出しは同期的であるため、無視しています。)

  • who >f1
    子がフォークされ、出力ファイルが上書きされ、出力ファイルが子の stdout に移動され、新しいプログラムが実行されます。
  • cat f2 | wc -l>f2
    子がフォークされ、パイプが作成され、別の子がフォークされ、子はパイプの端を必要に応じて stdin または stdout に移動し、1 つの子は入力ファイルを開くコマンドを実行し、他の子は上記のように出力を破棄します。

それが実際にあなたのシェルがしていることを保証するものではありません - おそらくそれはフォークする前にクロバーするでしょう- しかし、それは十分に近いです. それでは、これらのシェル コマンドを時間次元に配置してみましょう。

[time =====================================================================>]

# who >f1
-?->[clobber *f1*]-?->[dup to stdout]-?->[exec who(1)]-?->[...]

# cat f1 | wc -l>f2
-?->[pipe]-?->[fork]-?->[dup pipe]-?->[clobber *f2*]-?->[dup to stdout]-?->[exec wc(1)]
                +----?->[dup pipe]-?->[exec cat(1)]-?->[open *f1*]-?->[...]

上記の矢印はどれ-?->も任意に長くても短くてもかまいません。それを制御することはできません。おそらく、最初の clobber のcat(1)に実行されます (古いデータが表示されますか?)。そうでない可能性もあります。出力を書き込む前に実行されるかもしれませんし、そうでないかもしれません。who(1)

于 2013-07-25T15:04:26.140 に答える