przekierowanie kota

11

Powiedzmy, że plik o nazwie abcistnieje w bieżącym katalogu i ma w nim trochę tekstu. Po wykonaniu polecenia:

cat abc > abc

Dlaczego zawartość pliku abcznika?
Dlaczego polecenie usuwa w nim tekst, a plik staje się pustym plikiem?

Tulsi Kanodia
źródło
Aby dowiedzieć się więcej na temat rozwiązań, zobacz Czy mogę dokonać cutzmiany pliku na miejscu?
Gilles 'SO - przestań być zły'
10
Wskaźnik laserowy jest bardzo skutecznym narzędziem dla kotów przekierowania. </pun>
WBT
Mój kot bardzo słabo reaguje na przekierowanie ...
Ex Umbris
Aby uniknąć tego problemu, używam małego skryptu, który nazwałem psem :cat abc | dog abc
joeytwiddle 30.08.16
Inną opcją, jeśli nie przeszkadza ci wyjście na ekranie, jest użycie tee.
Andrea Lazzarotto,

Odpowiedzi:

27

Z powodu kolejności, w jaki sposób się to robi.

Kiedy to zrobisz:

cat abc > abc

>jest wyjściowym operatorem przekierowania, gdy powłoka to zobaczy, otwiera plik w trybie obcięcia za pomocą O_TRUNCflagi z open(2)ie open("abc", O_TRUNC), więc wszystko, co było w pliku, zniknie. Zauważ, że to przekierowanie odbywa się najpierw przez powłokę przed uruchomieniem catpolecenia.

Kiedy więc polecenie zostanie wykonane cat abc, plik abcjest już obcięty, dlatego catplik będzie pusty.

heemayl
źródło
1
Co z cat abc >> abc? Co się wtedy stanie?
Tulsi Kanodia
2
@TulsiKanodia - powoduje to nieskończoną pętlę. Za każdym razem, gdy kot czyta wiersz, dołącza kolejny przed przejściem do następnego.
user3490,
3
Jest to wykrywane i zapobiegane. Zamiast tego tekst cat: filename: input file is output file(gdzie filenamejest wybrana nazwa pliku) jest drukowany na starym standardzie.
UTF-8
@TulsiKanodia Zobacz unix.stackexchange.com/questions/154903/why-does-cat-xx-loop
Gilles 'SO- przestań być zły'
5

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:

> abc cat abc
l0b0
źródło