Можно ли использовать тот же входной файл, что и для вывода команды? - PullRequest
32 голосов
/ 16 июня 2010

Рассмотрим что-то вроде:

cat file | command > file

Это хорошая практика? Может ли это перезаписать входной файл в то же время, когда мы его читаем, или он всегда сначала читается в памяти, а затем передается второй команде?

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

t=$(mktemp)
cat file | command > ${t} && mv ${t} file

Ответы [ 3 ]

46 голосов
/ 16 июня 2010

Нет, это не хорошо.Все команды в конвейере выполняются одновременно, и оболочка готовит перенаправления перед выполнением команд.Таким образом, вполне вероятно, что команда перезапишет файл, прежде чем cat прочитает его.

Вам нужно sponge (1) из moreutils.

3 голосов
/ 17 июня 2010

Вы также можете использовать что-то вроде этого (не рекомендуется использовать явные временные файлы в рабочем коде):

{ rm file && your_command > file; } < file
0 голосов
/ 05 марта 2016

Мало того, что вы НЕ должны записывать свои выходные данные на вход, но также вы должны избегать зацикливания своих выходных данных обратно на ваш вход.

При работе с большими файлами я пытался

    cat *allfastq30 > Sample_All_allfastq30

и генерируются сообщения об ошибках:

    cat: Sample_All_allfastq30: input file is output file
...