Próbowałem rev
utworzyć plik, a następnie potokować go, cat > same_file
ale zamieniał się on w pusty plik.
Podczas gdy próbowałem rev file.txt | cat > file2.txt && mv file.txt file2.txt;
, zadziałało.
Nawet rev file.txt | cat >> file.txt;
pracował.
Ale kiedy próbowałem, rev file.txt | cat > file.txt
nie udało się.
command-line
redirect
Vintux
źródło
źródło
cat
na zewnątrz tak:rev file.txt > file2.txt && mv file2.txt file.txt
. Jest to zbyteczne użyciecat
. Pomijając to, oszczędzasz spawnowanie dodatkowego procesu.Odpowiedzi:
Podstawową rzeczą, którą musisz zrozumieć w tym przypadku między dwoma sposobami przekierowania (> i >>) jest:
>
Przekierowuje i zastępuje informacje tam, gdzie zostały wskazane. Dzieje się tak podczas odbierania jakichkolwiek informacji przez potok „|”
>>
Przekierowuje i konkatenuje do wskazanych informacji. Dzieje się tak podczas odbierania jakichkolwiek informacji przez potok „|”
W obu przypadkach, jeśli plik nie istnieje, zostanie utworzony zamiast tego. Tylko w „>>” informacje zostaną połączone, jeśli uruchomisz je ponownie w tym samym pliku. Za pomocą „>” po prostu zastąpisz wszystko, co zrobiłeś przy pierwszym uruchomieniu.
Ale tutaj jest umowa, gdy używasz tego samego pliku wejściowego co plik wyjściowy. W tym konkretnym przypadku, jeśli użyjesz „>”, usuniesz informację, którą część „wejściowa” musi przeanalizować, ponieważ plik wyjściowy „nadpisze” ją. Więc w:
W „objaśnieniu w zwolnionym tempie” tak naprawdę dzieje się:
rev
przygotowuje się do odwrócenia zawartościfile.txt
i przesłania jej do potokurev
przesyłania informacji do potoku potok przesyła je bezpośrednio docat
.cat
odbierania informacji automatycznie zastosuje je do tego, dla któregofile.txt
zostały ustawione.cat
nie będzie czekać narev
potokowanie całego pliku. Po prostu zacznie się w momencie, gdy dotrze do niego pierwsza część informacji, co oznacza, że w zależności od użytego symbolu otworzy połączeniefile.txt
.file.txt
podczas oczekiwania na dostęp do nowych informacji. Za pomocą >> otworzy połączeniefile.txt
i poczeka na nowe informacje na temat ostatniej wykrytej linii.file.txt
pomocą > ,rev
postaram się to zrobić i nic nie dostanę, ponieważcat
usuwam wszystko w ramach przygotowań do nowych informacji.Dlaczego więc inni pracują po przeczytaniu powyższego. Z tego powodu:
Tutaj przesyłasz do cat, który wysyła informacje do innego pliku. W takim przypadku przetworzony plik wejściowy
file.txt
nie jest taki sam jak plik wyjściowyfile2.txt
. Po tym jesteś dosłownie nadpisywania całafile2.txt
zfile.txt
, więc cały proces złożony przezcat
został usunięty. Zasadniczo całą linię można uprościć,cp file.txt file2.txt
ponieważ robi to samo, ponieważfile2.txt
na końcu tracirev
i jest zastępowanemv
poleceniem.W tym przypadku, gdy łącząc informacje do tego samego pliku. Czyli tylko otwiera połączenie z tym plikiem, ale nie usuwa informacji widocznych za pomocą jednego > . Końcowym rezultatem powinny być oryginalne informacje plus informacje odwrócone.
źródło
rev file.txt | cat --bogus-option > file.txt
spowoduje także obcięcie pliku, nawet jeśli kot nie będzie próbował go otworzyć.moreutils
), który zawierasponge
narzędzie zaprojektowane specjalnie do użycia w przypadku zastąpienia pliku wejściowego. Na przykładrev file.txt >file2.txt && mv file2.txt file.txt
obejdzie się obejścierev file.txt | sponge file.txt
, które będzie działać poprawnie, nawet jeśli istnieje już coś o nazwiefile2.txt
.Gdy powłoka widzi przekierowanie, najpierw otwiera odpowiednie pliki, przed wykonaniem któregokolwiek z poleceń. Tak więc, gdy robisz:
Przekierowanie
file.txt
powoduje, że jest ono obcinane przedfoo
uruchomieniem i można je odczytaćfile.txt
. Na marginesie, dlatego nie możesz zrobić:I dlaczego
sed
ma opcję edycji w miejscu.Na koniec:
jest bezużytecznym używaniem kota , zwłaszcza jeśli próbujesz czytać
file.txt
wcześniej.Jeśli chcesz cofnąć plik w miejscu, nie ma skrótów . Możesz być w stanie użyć sztuczek
sed
lubawk
sztuczek z edycją lokalną.źródło
>
to readresator (operator) wysyłający dane wyjściowe do czegoś innego(wejście następnej komendy, drukarka ...)
W twoim przypadku dane wyjściowe trafiają do pliku
file.txt
, jeśli ten plik już istnieje, jest nadpisywany, jeśli nie, jest tworzony.>>
jest operatorem dołączającym, jeślifile.txt
już istnieje, wynik jest dołączany na końcu pliku. jeśli plik nie istnieje, jest tworzony, a dane wyjściowe zapisywane w nowym pliku, tak samo jak>
(redirector).źródło
>
i>>
.Możesz używać Vima w trybie Ex:
%
wybierz wszystkie linie!
Uruchom poleceniex
Zapisz i zamknijźródło