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:
rev file.txt | cat > file.txt
W „objaśnieniu w zwolnionym tempie” tak naprawdę dzieje się:
rev
przygotowuje się do odwrócenia zawartości file.txt
i przesłania jej do potoku
- Podczas
rev
przesyłania informacji do potoku potok przesyła je bezpośrednio do cat
.
- Podczas
cat
odbierania informacji automatycznie zastosuje je do tego, dla którego file.txt
zostały ustawione.
- Słowo kluczowe to „while”, ponieważ wszystko dzieje się w tym samym czasie. Zobacz poniższe doskonałe komentarze Emila, aby lepiej zrozumieć tę część.
cat
nie będzie czekać na rev
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łączenie file.txt
.
- W tym przypadku, ponieważ użyłeś > zamiast >> , powłoka obetnie plik wyjściowy, co oznacza, że otworzy i wyczyści informacje
file.txt
podczas oczekiwania na dostęp do nowych informacji. Za pomocą >> otworzy połączenie file.txt
i poczeka na nowe informacje na temat ostatniej wykrytej linii.
- Ponieważ informacje zostały już wyczyszczone za
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:
rev file.txt | cat > file2.txt && mv file.txt file2.txt
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ściowy file2.txt
. Po tym jesteś dosłownie nadpisywania cała file2.txt
z file.txt
, więc cały proces złożony przez cat
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 traci rev
i jest zastępowane mv
poleceniem.
rev file.txt | cat >> file.txt
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.
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.