понимание перенаправления bash с помощью > голец

Я изучаю bash и не могу понять, что происходит с перенаправлением вывода в следующем примере:

У меня есть файл myfile.txt со следующим содержимым.

Практика делает Совершенным

Я собираюсь использовать команду tr, чтобы заменить P на p :

cat myfile.txt | tr P p

Это делает то, что я хочу, теперь я собираюсь поместить результат обратно в исходный файл:

cat myfile.txt | tr P p > myfile.txt

Но после выполнения вышеупомянутой команды myfile.txt пусто ... почему это происходит?


Обновление:

Если я отправлю вывод в другой файл, то он будет работать как положено:

cat myfile.txt | tr P p > anotherfile.txt
1
задан 22 August 2019 в 08:30

3 ответа

Bash (и другие совместимые POSIX оболочки) следует двум правилам, которые объясняют это поведение:

  • Перенаправление происходит перед выполненными командами.

  • Если файл существует, это усеченное (освобожденный), когда перенаправление переходит к файлу как в > myfile.txt.

Таким образом, потому что существует > перенаправление содержание myinput.txt будьте отброшены и cat печать ничто, cat выходы и завершения канал и tr закрывает файл, ничего не пишущий в него. Порядок, в котором запуск команд не особенно важен (и он не гарантируется, см. ответ Gille здесь). Но то, что важно, то, что перенаправление, происходящее перед запуском команд; это - стандартные потоки каждой команды, подготовлены, и это - то, что вызывает пустой файл в конце.

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

См. также:

2
ответ дан 7 December 2019 в 13:15

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

В Вашем случае я использовал бы команду TR следующим образом:

tr P p < myInput.txt > myOutput.txt
0
ответ дан 7 December 2019 в 13:15

Используйте: sort -o вместо перенаправления. Таким образом, вы сможете писать в тот же файл.

cat myfile.txt | tr P p | sort -o myfile.txt
0
ответ дан 2 January 2020 в 05:32

Другие вопросы по тегам:

Похожие вопросы: