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?


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.


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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.