2010-12-15 3 views
1
TMP="$$.FILE" 

#Process puts contents into TMP 

cat "$TMP" | sort | head > "$TMP" 

Я уже убедился, что файл не был пустым для начала. Без > "$TMP" он выводит что-то, но когда он снова хранится в том же файле, его пустой. Что может быть причиной?Почему это может привести к тому, что файл будет пустым?

ответ

2

Эти процессы запускаются параллельно, поэтому головная команда обрезает файл, прежде чем кошка сможет его прочитать.

Чтобы получить нужный результат, вам нужно записать вывод сортировки в другой файл, а затем переместить его поверх оригинала.

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

+1 - Спасибо – Strawberry 2010-12-15 17:02:01

+0

`рода "$ TMP" | голова> "$ TMP" .new && мв "$ TMP" .new "$ TMP"` будет держать сбивание файл! если есть ошибка (и это дает `cat` отдых) – 2010-12-15 20:16:38

3

Вы не можете писать и читать из файла одновременно. Примерно, что происходит:

  1. > "$TMP" вызывает открытие файла для записи, что также обрезает файл.
  2. cat "$TMP" читает теперь пустой файл.
  3. Файл остается пустым.

Команды, которые хотят изменить файл на месте, фактически выполняют бит файла temp, перетасованного под обложки. Например, sed -i обработает входной файл и сохранит результаты до input.tmp, затем сделайте mv input.tmp input в конце, чтобы перезаписать оригинал. Вы должны следовать этой модели.

1

Последний канал обрезает файл, который читает первый трубок, прежде чем что-либо действительно произойдет. Итак, что происходит, cat пытается прочитать файл, вызов которого head сразу же усечен. Это вызывает проблемы здесь; оператор > является оператором оболочки, что означает «усечь этот файл сразу, а затем процесс написать свой стандартный вывод в файл.

На соответствующую записку, вам не нужно cat здесь.

Try вместо этого:

TMP="$$.FILE"  
sort <"$TMP" | head > "$TMP.tmp" 
mv "$TMP.tmp" "$TMP" 
Смежные вопросы