Как работают `>` и `>>`?

Я попытался просмотреть файл, а затем cat > same_file его в cat > same_file но он превратился в пустой файл.

Пока я пробовал rev file.txt | cat > file2.txt && mv file.txt file2.txt; rev file.txt | cat > file2.txt && mv file.txt file2.txt; это сработало.

Даже rev file.txt | cat >> file.txt; rev file.txt | cat >> file.txt; работал.

Но когда я попробовал rev file.txt | cat > file.txt rev file.txt | cat > file.txt не удалось.

Основная вещь, которую вам нужно понять в этом случае между обоими способами перенаправления (> и >>):

>

Перенаправляет и перезаписывает информацию, на которую она была указана. Это происходит при получении любой информации через канал «|»

>>

Переадресовывает и объединяет информацию, на которую он указал. Это происходит при получении любой информации через канал «|»

В обоих случаях, если файл не существует, он будет создан вместо этого. Только на «>>» информация будет конкатенирована, если вы запустите ее снова в том же файле. С помощью «>» вы просто перезапишите все, что вы сделали при первом запуске.

Но вот сделка при использовании того же входного файла, что и выходной файл. В этом конкретном случае, если вы используете «>», вы удаляете информацию, которую должна обрабатывать часть «ввода», поскольку выходной файл будет «перезаписывать». Итак, в:

 rev file.txt | cat > file.txt 

То, что на самом деле происходит в «замедленном движении», таково:

  1. rev готовит для изменения содержимого file.txt и отправляет его на канал
  2. Пока rev передает информацию в трубку, потоки потоков передаются непосредственно в cat .
  3. Пока cat получает информацию, она автоматически применит ее к file.txt с file.txt она была установлена.
  4. Ключевое слово здесь «while», потому что все происходит одновременно. Пожалуйста, ознакомьтесь с замечательными комментариями, приведенными Эмилем для более глубокого понимания этой части.
  5. cat не будет ждать rev для того, чтобы передать весь файл. Он просто начнет с минуты, когда первая часть информации попадет на него, а это означает, что в зависимости от того, какой символ вы использовали, он откроет соединение с file.txt .
  6. В этом случае, поскольку вы использовали > вместо >> , оболочка будет обрезать выходной файл, что означает, что он откроет и очистит информацию file.txt , ожидая получения новой информации. С помощью >> он откроет соединение с file.txt и дождитесь появления новой информации об обнаруженной последней строке.
  7. Поскольку информация уже была очищена в 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 

В этом случае вы объединяете информацию в тот же файл. Таким образом, он только открывает соединение с этим файлом, но не удаляет информацию, как видно с помощью одного > . Конечным результатом должна быть исходная информация плюс обратная информация.

Когда оболочка видит перенаправление, она сначала открывает соответствующие файлы перед выполнением любой из задействованных команд. Таким образом, когда вы это делаете:

 foo file.txt | bar > file.txt 

Перенаправление в file.txt заставляет его усекать до запуска foo и может читать file.txt . С другой стороны, вот почему вы не можете сделать:

 sed 'blah' file.txt > file.txt 

И почему у sed есть опция редактирования на месте.

Наконец, делая:

 .. | cat > file.txt 

это бесполезное использование кошки , особенно если вы пытаетесь прочитать file.txt раньше.

Если вы хотите перевернуть файл на месте, нет ярлыков . Возможно, вы сможете использовать трюки sed или awk с редактированием на месте.

> – перенаправитель (оператор), отправляющий вывод на что-то еще
(ввод следующей команды, принтер ..)

В вашем случае вывод идет в файл file.txt , если этот файл уже существует, он перезаписывается, если он не создается.

>> – это оператор append, если file.txt уже существует, выход добавляется в конец файла. если файл не существует, он создается, а вывод записывается в новый файл, такой же как > (перенаправитель).

Вы можете использовать Vim в режиме Ex:

 ex -sc '%!rev' -cx file.txt 
  1. % выбрать все строки

  2. ! Команда Run

  3. x сохранить и закрыть