Dlaczego przekierowanie do tego samego pliku obcina plik?

11

Zwykle używamy innego pliku do przekierowania wyjścia.

Na przykład :

cat < first > temp

W tym poleceniu zawartość pierwszego przekierowuje do temp zamiast standardowego wyjścia.

Dlaczego więc obcina plik, jeśli używam tej samej nazwy pliku?

Dlaczego nie może zastąpić tego samego pliku?

cat < first > first 
Searock
źródło

Odpowiedzi:

19

Gdy używasz takiego przekierowania we / wy, zarówno plik „wejściowy”, jak i „wyjściowy” są otwierane przez powłokę przed wykonaniem polecenia. A otwarcie pliku do zastąpienia jest tym samym, co obcięcie go przed zapisaniem. Wynik: catwidzi pusty plik na wejściu ...

JanC
źródło
0

Ponieważ obsługa tego w ogólnym przypadku byłaby bardzo skomplikowana. Rozważ następujący przykład:

Program odczytuje plik linia po linii i wysyła każdą linię dwa razy. Teraz, aby działało to bez drugiego pliku (tj. Na tym samym pliku), program musiałby buforować większość (wszystkich) wierszy, które będzie czytać, ponieważ w przeciwnym razie zostaną one nadpisane, zanim będą mogły zostać odczytane.

Aby zachować prostotę, proste programy zwykle używają dodatkowego, tymczasowego pliku, który po zakończeniu przenoszą nad oryginałem. Tak działa na przykład sed -i(wbudowany).

Szara Pantera
źródło
0

Zazwyczaj składnia przekierowywania w tym przypadku powinna być cat first > temp. Oznacza to, że catdane wyjściowe firstsą wysyłane do pliku temp. W przypadku wyciągu cat < first > tempdane wyjściowe catnie zostały ukończone w momencie przekierowania na zewnątrz. Nic nie skutkuje niczym.

Jednak catprzekierowanie pliku i wyjście przekierowane do innego pliku nie różni się niczym od podstawowego cp.

Casey Keller
źródło
cat < first > tempdziała dobrze.
JanC