Powiedzmy, że plik o nazwie abc
istnieje w bieżącym katalogu i ma w nim trochę tekstu. Po wykonaniu polecenia:
cat abc > abc
Dlaczego zawartość pliku abc
znika?
Dlaczego polecenie usuwa w nim tekst, a plik staje się pustym plikiem?
files
io-redirection
cat
Tulsi Kanodia
źródło
źródło
cut
zmiany pliku na miejscu?cat abc | dog abc
tee
.Odpowiedzi:
Z powodu kolejności, w jaki sposób się to robi.
Kiedy to zrobisz:
>
jest wyjściowym operatorem przekierowania, gdy powłoka to zobaczy, otwiera plik w trybie obcięcia za pomocąO_TRUNC
flagi zopen(2)
ieopen("abc", O_TRUNC)
, więc wszystko, co było w pliku, zniknie. Zauważ, że to przekierowanie odbywa się najpierw przez powłokę przed uruchomieniemcat
polecenia.Kiedy więc polecenie zostanie wykonane
cat abc
, plikabc
jest już obcięty, dlategocat
plik będzie pusty.źródło
cat: filename: input file is output file
(gdziefilename
jest wybrana nazwa pliku) jest drukowany na starym standardzie.Dodając do odpowiedzi @ heemayl , jeśli chcesz, aby kod był bardziej przejrzysty na temat sekwencji, w jakiej się dzieją, możesz po prostu umieścić wszelkie przekierowania na początku polecenia:
źródło