Я попытался rev
создать файл, а затем cat > same_file
передать его, но он превратился в пустой файл.
Пока я пытался rev file.txt | cat > file2.txt && mv file.txt file2.txt;
это сработало.
Даже rev file.txt | cat >> file.txt;
работал.
Но когда я попробовал rev file.txt | cat > file.txt
это не удалось.
command-line
redirect
Vintux
источник
источник
cat
вот так:rev file.txt > file2.txt && mv file2.txt file.txt
. Это излишнее использованиеcat
. Оставляя это вне, вы избавляетесь от создания дополнительного процесса.Ответы:
Основное, что вам нужно понять в этом случае между двумя способами перенаправления (> и >>):
>
Перенаправляет и перезаписывает информацию, на которую она была указана. Это происходит при получении любой информации через канал "|"
>>
Перенаправляет и объединяет информацию, на которую он был указан. Это происходит при получении любой информации через канал "|"
В обоих случаях, если файл не существует, он будет создан вместо. Только в «>>» информация будет объединена, если вы снова запустите ее в том же файле. С помощью «>» вы просто перезаписываете все, что делали при первом запуске.
Но здесь есть дело, когда используется тот же входной файл, что и выходной файл. В этом конкретном случае, если вы используете «>», вы удалите информацию, которую «входная» часть должна проанализировать, так как выходной файл будет «перезаписывать ее». Итак, в:
Что на самом деле происходит в «объяснении замедленного движения»:
rev
готовится отменить содержаниеfile.txt
и отправить его в трубуrev
отправляет информацию в канал, канал направляет ее напрямуюcat
.cat
получает информацию , которую он будет автоматически применить его кfile.txt
он был установлен с.cat
не будет ждать,rev
чтобы передать весь файл. Он просто запустится в ту минуту, когда к нему поступит первая часть информации, а это означает, что в зависимости от того, какой символ вы использовали, он откроет соединениеfile.txt
.file.txt
ожидании новой информации, чтобы добраться до него. С >> он установит соединениеfile.txt
и будет ждать новой информации в последней обнаруженной строке.file.txt
с помощью > ,rev
он попытается выполнить свою работу и ничего не получит, потому чтоcat
удалил все в процессе подготовки к новой информации.Так почему другие работают после прочтения выше? Из-за этого:
Здесь вы отправляете сообщение коту, который отправляет информацию в другой файл. В этом случае обработанный входной файл
file.txt
не совпадает с выходным файломfile2.txt
. После того, что вы буквально перезаписывать всеfile2.txt
сfile.txt
, так что весь процесс сделанcat
был удален. По сути, вся строка может быть упрощена, например,cp file.txt file2.txt
потому что она делает то же самое, такfile2.txt
как в конце теряетrev
и перезаписываетсяmv
командой.В этом случае вы объединяете информацию в один файл. Таким образом, он только открывает соединение с этим файлом, но не стирает информацию, как видно с помощью одного > . Конечный результат должен быть, исходная информация плюс обратная информация.
источник
rev file.txt | cat --bogus-option > file.txt
будет также усечен файл, даже если cat не будет пытаться открыть его.moreutils
), которая включает вsponge
себя инструмент, специально разработанный для сценария перезаписи входного файла. Например, существуетrev file.txt >file2.txt && mv file2.txt file.txt
обходной путьrev file.txt | sponge file.txt
, который будет работать правильно, даже если имя уже естьfile2.txt
.Когда оболочка видит перенаправление, она сначала открывает соответствующие файлы перед выполнением любой из задействованных команд. Таким образом, когда вы делаете:
Перенаправление
file.txt
вызывает его обрезание передfoo
запуском и чтениемfile.txt
. Кстати, вот почему вы не можете сделать:И почему
sed
есть возможность редактирования на месте.Наконец, делая:
это бесполезно использование кошки , особенно так , если вы пытаетесь прочитать от
file.txt
ранее.Если вы хотите перевернуть файл на месте, ярлыки отсутствуют . Вы можете использовать трюки
sed
илиawk
с редактированием на месте.источник
>
перенаправитель (оператор), отправляющий вывод чему-либо еще(ввод следующей команды, принтер ..)
В вашем случае вывод идет в файл
file.txt
, если этот файл уже существует, он перезаписывается, если не создается.>>
является оператором добавления, если онfile.txt
уже существует, вывод добавляется в конец файла. если файл не существует, он создается, и вывод записывается в новый файл, так же как>
(перенаправитель).источник
>
и>>
операторов.Вы можете использовать Vim в режиме Ex:
%
выбрать все строки!
Команда Runx
сохранить и закрытьисточник