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