Можно ли использовать тот же входной файл, что и вывод команды pipe?
Рассмотрим что-то вроде:
cat file | command > file
Это хорошая практика? Может ли это перезаписать входной файл так же, как мы его читаем, или он всегда считывается сначала в памяти, а затем передается во вторую команду?
Очевидно, что я могу использовать временные файлы в качестве промежуточного шага, но мне просто интересно..
t=$(mktemp)
cat file | command > ${t} && mv ${t} file
Ответы
Ответ 1
Нет, это не нормально. Все команды в конвейере выполняются в одно и то же время, и оболочка готовит перенаправления перед выполнением команд. Таким образом, вполне вероятно, что команда перезапишет файл до того, как кошка прочитает его.
Вам понадобится губка (1) из moreutils.
Ответ 2
Вы также можете использовать что-то вроде этого (не рекомендуется использовать явные временные файлы в производственном коде):
{ rm file && your_command > file; } < file
Ответ 3
Не только вы НЕ должны писать свой вывод на свой вход, но также вы должны избегать циклического вывода вашего вывода на ваш вход.
При работе с большими файлами я попробовал
cat *allfastq30 > Sample_All_allfastq30
и он сгенерировал сообщения об ошибках:
cat: Sample_All_allfastq30: input file is output file