2010-12-15 13 views

答えて

2

これらのプロセスはすべて並列で実行されるため、catコマンドで読み込む前にheadコマンドでファイルが切り詰められます。

あなたが望む結果を得るには、ソート出力を別のファイルに書き込んで、それを元のファイルに移動する必要があります。

cat "$TMP" | sort | head > "$TMP".new 
mv "$TMP".new "$TMP" 
+0

1 - ありがとう – Strawberry

+0

'ソート "$ TMP" |ヘッド> "$ TMP" .new && mvは "$ TMP" .new "$ TMPは、"'ファイルをつかうから続けますエラーがあれば(そして、 'cat'は休憩になります) –

3

同時にファイルに書き込んだり読み込んだりすることはできません。ここでは何が起こるかおおよそ次のとおりです。

  1. > "$TMP"ファイルは、ファイルを切り捨て書き込み、のためにオープンされます。
  2. cat "$TMP"今から空白のファイルを読み込みます。
  3. ファイルは空のままです。

実際にファイルを修正するためのコマンドは、実際にはカバーの下に一時的なファイルシャッフルを実行します。たとえば、sed -iは入力ファイルを処理し、結果をinput.tmpに保存し、最後にmv input.tmp inputを実行して元のファイルを上書きします。あなたはそのモデルに従うべきです。

+0

それで解決策は何ですか?別のTMPファイルを作成しますか? – Strawberry

1

実際に何かが起こる前に、最初のパイプが読み取るファイルを最後のパイプで切り捨てます。だから、catは、headへの呼び出しがすぐに切り捨てられたファイルを読み込もうとします。これが問題の原因です。 、あなたはここでcatを関連ノートで>演算子「すぐにこのファイルを切り捨てた後、プロセスはファイルにその標準出力を書き込む持っていることを意味シェル演算子である。

必要はありません。

てみてくださいこの代わりに:!

TMP="$$.FILE"  
sort <"$TMP" | head > "$TMP.tmp" 
mv "$TMP.tmp" "$TMP" 
関連する問題