以下のコマンドで説明してください:
touch temp.txt
touch temp1.txt
who > temp.txt &
cat temp.txt | wc -l >temp1.txt &
temp.txt ファイルについて言うと、空のファイルです。したがって、実行後にファイルに表示されるものは何temp.txt
ですかtemp1.txt
。
ジョブはバックグラウンド モードで実行されているため、考えられるケースを誰か説明してもらえますか?
以下のコマンドで説明してください:
touch temp.txt
touch temp1.txt
who > temp.txt &
cat temp.txt | wc -l >temp1.txt &
temp.txt ファイルについて言うと、空のファイルです。したがって、実行後にファイルに表示されるものは何temp.txt
ですかtemp1.txt
。
ジョブはバックグラウンド モードで実行されているため、考えられるケースを誰か説明してもらえますか?
temp.txt
when cat
is runの状態は制御できません (スケジューラー whencat
とwho
run が相互に関連している) ため、何が起こるかを予測することはできません。より安全なバージョンは
# 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
場合によります。 cat(1)
入力ファイルに何かが表示されるか、何も表示されない場合があります。
これは、最後の 2 つのコマンドで何が起こっているかを大まかに示したものです。touch(1)
(呼び出しは同期的であるため、無視しています。)
who >f1
cat f2 | wc -l>f2
それが実際にあなたのシェルがしていることを保証するものではありません - おそらくそれはフォークする前にクロバーするでしょう- しかし、それは十分に近いです. それでは、これらのシェル コマンドを時間次元に配置してみましょう。
[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)