Почему это может привести к тому, что файл будет пустым? - PullRequest
1 голос
/ 15 декабря 2010
TMP="$$.FILE"

#Process puts contents into TMP

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

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

Ответы [ 3 ]

3 голосов
/ 15 декабря 2010

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

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

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

2 голосов
/ 15 декабря 2010

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

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

cat "$TMP" | sort | head > "$TMP".new
mv "$TMP".new "$TMP"
1 голос
/ 15 декабря 2010

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

В связанной заметке вам не нужно cat здесь.

Попробуйте вместо этого:

TMP="$$.FILE"    
sort <"$TMP" | head > "$TMP.tmp"
mv "$TMP.tmp" "$TMP"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...