Основное, что вам нужно понять в этом случае между двумя способами перенаправления (> и >>):
>
Перенаправляет и перезаписывает информацию, на которую она была указана. Это происходит при получении любой информации через канал "|"
>>
Перенаправляет и объединяет информацию, на которую он был указан. Это происходит при получении любой информации через канал "|"
В обоих случаях, если файл не существует, он будет создан вместо. Только в «>>» информация будет объединена, если вы снова запустите ее в том же файле. С помощью «>» вы просто перезаписываете все, что делали при первом запуске.
Но здесь есть дело, когда используется тот же входной файл, что и выходной файл. В этом конкретном случае, если вы используете «>», вы удалите информацию, которую «входная» часть должна проанализировать, так как выходной файл будет «перезаписывать ее». Итак, в:
rev file.txt | cat > file.txt
Что на самом деле происходит в «объяснении замедленного движения»:
revготовится отменить содержание file.txtи отправить его в трубу
- Пока
revотправляет информацию в канал, канал направляет ее напрямую cat.
- В то время как
catполучает информацию , которую он будет автоматически применить его к file.txtон был установлен с.
- Ключевое слово здесь - «время», потому что все происходит одновременно. Пожалуйста, посмотрите превосходные комментарии Эмиля ниже, чтобы глубже понять эту часть.
catне будет ждать, revчтобы передать весь файл. Он просто запустится в ту минуту, когда к нему поступит первая часть информации, а это означает, что в зависимости от того, какой символ вы использовали, он откроет соединение file.txt.
- В этом случае, так как вы использовали > вместо >> , оболочка будет обрезать выходной файл, что означает, что она откроет и очистит информацию в
file.txtожидании новой информации, чтобы добраться до него. С >> он установит соединение file.txtи будет ждать новой информации в последней обнаруженной строке.
- Поскольку информация уже была очищена
file.txtс помощью > , revон попытается выполнить свою работу и ничего не получит, потому что catудалил все в процессе подготовки к новой информации.
Так почему другие работают после прочтения выше? Из-за этого:
rev file.txt | cat > file2.txt && mv file.txt file2.txt
Здесь вы отправляете сообщение коту, который отправляет информацию в другой файл. В этом случае обработанный входной файл file.txtне совпадает с выходным файлом file2.txt. После того, что вы буквально перезаписывать все file2.txtс file.txt, так что весь процесс сделан catбыл удален. По сути, вся строка может быть упрощена, например, cp file.txt file2.txtпотому что она делает то же самое, так file2.txtкак в конце теряет revи перезаписывается mvкомандой.
rev file.txt | cat >> file.txt
В этом случае вы объединяете информацию в один файл. Таким образом, он только открывает соединение с этим файлом, но не стирает информацию, как видно с помощью одного > . Конечный результат должен быть, исходная информация плюс обратная информация.
catвот так:rev file.txt > file2.txt && mv file2.txt file.txt. Это излишнее использованиеcat. Оставляя это вне, вы избавляетесь от создания дополнительного процесса.