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ę:
revprzygotowuje się do odwrócenia zawartości file.txti przesłania jej do potoku
- Podczas
revprzesyłania informacji do potoku potok przesyła je bezpośrednio do cat.
- Podczas
catodbierania informacji automatycznie zastosuje je do tego, dla którego file.txtzostał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ęść.
catnie będzie czekać na revpotokowanie 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.txtpodczas oczekiwania na dostęp do nowych informacji. Za pomocą >> otworzy połączenie file.txti poczeka na nowe informacje na temat ostatniej wykrytej linii.
- Ponieważ informacje zostały już wyczyszczone za
file.txtpomocą > , revpostaram się to zrobić i nic nie dostanę, ponieważ catusuwam 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.txtnie jest taki sam jak plik wyjściowy file2.txt. Po tym jesteś dosłownie nadpisywania cała file2.txtz file.txt, więc cały proces złożony przez catzostał usunięty. Zasadniczo całą linię można uprościć, cp file.txt file2.txtponieważ robi to samo, ponieważ file2.txtna końcu traci revi jest zastępowane mvpoleceniem.
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.
catna 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.