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

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

cat file | command > file

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

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

t=$(mktemp)
cat file | command > ${t} && mv ${t} file
32
задан zx8754 20 December 2017 в 08:17
поделиться

2 ответа

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

Вам понадобится губка (1) от moreutils.

46
ответ дан 27 November 2019 в 20:56
поделиться

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

{ rm file && your_command > file; } < file
3
ответ дан 27 November 2019 в 20:56
поделиться