Подтвердить что ты не робот

Можно ли использовать тот же входной файл, что и вывод команды pipe?

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

cat file | command > file

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

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

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

Ответ 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