Bash: Почему чтение и запись в один и тот же файл в конвейере дают ненадежные результаты?
У меня есть куча файлов, которые содержат много пустых строк, и хочу удалить все повторяющиеся пустые строки, чтобы облегчить чтение файлов. Я написал следующий скрипт:
#!/bin/bash
for file in * ; do cat "$file" | sed 's/^ \+//' | cat -s > "$file" ; done
Однако это дало очень ненадежные результаты: большинство файлов стали полностью пустыми, и только несколько файлов имели ожидаемые результаты. Более того, работающие файлы менялись случайным образом каждый раз, когда я повторял попытку, так как разные файлы корректно редактировались при каждом запуске. В чем дело?
Примечание. Это скорее теоретический вопрос, потому что я понимаю, что могу использовать обходной путь, например:
#!/bin/bash
for file in * ; do
cat "$file" | sed 's/^ \+//' | cat -s > "$file"-tmp
rm "$file"
mv "$file"-tmp "$file"
done
Но это кажется излишне запутанным. Так почему же «прямой» метод так ненадежен?