Czy istnieje przypadek ...
lub kontekst, w którym cat file | ...
zachowuje się inaczej niż ... <file
?plik cat | ... vs ... <plik
Odpowiedz
Podczas odczytu ze zwykłego pliku, cat
jest odpowiedzialny za odczyt danych, wykonuje je zgodnie z oczekiwaniami i może ograniczać je w sposobie, w jaki zapisuje je do potoku. Oczywiście same treści są zachowane, ale wszystko inne może zostać skażone. Na przykład: wielkość bloku i czas nadejścia danych. Dodatkowo rura sama w sobie nie zawsze jest neutralna: służy jako dodatkowy bufor między wejściem a wejściem.
Szybki i łatwy sposób, aby rozmiar bloku pozorny problem:
$ cat large-file | pv >/dev/null
5,44GB 0:00:14 [ 393MB/s] [ <=> ]
$ pv <large-file >/dev/null
5,44GB 0:00:03 [1,72GB/s] [=================================>] 100%
Ciekawe, chociaż biorąc pod uwagę, że read() używa skończony bufor, tak czy inaczej trafisz w niektóre procesy minimalny rozmiar bufora. Strace pokazuje, że kot używa 32kB czyta i pv 128kB na mojej platformie. – msw
O, hej, mój przykład nie pasuje właściwie do pytania, ponieważ nie używam
@msw dostanie * bardzo * w zależności od implementacji 'cat', ale postaram się uczynić to widocznym w inny sposób. –
cat file |
uruchamia inny program (cat), który nie musi rozpoczynać się w drugim przypadku. Powoduje to także większe zamieszanie, jeśli chcesz użyć "tutaj dokumentów". Ale powinno zachowywać się tak samo.
cat
pozwoli Ci potokować wiele plików sekwencyjnie. W przeciwnym razie przekierowanie <
i cat file |
powoduje takie same efekty uboczne.
Rury spowodować powłoki w tle powoływać się na komendzie po prawej stronie. Wpływa to na zmienne środowiskowe.
cat foo | while read line
do
...
done
echo "$line"
kontra
while read line
do
...
done < foo
echo "$line"
Obie dały takie same wyniki, gdy je wypróbowałem. –
interesujący efekt uboczny. – pra
@JB: Ustaw zmienną w pętli, a następnie echo po pętli. Zmieniona wartość będzie obowiązywała tylko po przekierowanym formularzu i nie będzie po wypisanym formularzu. Kolejną demonstracją jest "cd" wewnątrz pętli i 'pwd' po pętli. –
oprócz rzeczy zamieszczonych przez innych użytkowników, przy użyciu przekierowanie wejściowe z pliku, standardowe wejście jest plik ale gdy potokiem wyjście kota na wejście, standardowe wejście jest strumień z zawartością pliku. Kiedy standardowe wejście to plik będzie mógł szukać w pliku, ale potok nie pozwoli na to. Widać to poprzez znalezienie pliku zip i uruchamiając następujące polecenia:
zipinfo /dev/stdin < thezipfile.zip
i
cat thezipfile.zip | zipinfo /dev/stdin
Pierwsze polecenie pokaże zawartość na kartę SD, podczas gdy drugi pokaże błąd, choć jest błędem wprowadzającym w błąd, ponieważ zipinfo nie sprawdza później wyniku wyszukiwania i błędów.
A bezużyteczne użycie kota to zawsze należy go unikać:. To jest jak jazda z hamulca ręcznego na. To marnuje cykle procesora na nic, system operacyjny nieustannie przełącza kontekst między procesem kotów a następnym w rurze. Gdyby wszystkie bezużyteczne koty na świecie zniknęły i przestałyby być wymyślane, wymyślane na nowo, przekazywane z ojca na syna, nie mielibyśmy globalnego ocieplenia, ponieważ moglibyśmy z łatwością żyć z 1,21 Gigawatów zaoszczędzonej energii.
Dzięki. Czuję się teraz lepiej. Dołączcie do mnie w mojej krucjacie, aby zniweczyć bezużyteczne wykorzystanie kota na stackoverflow. Ta strona jest, o ile ją postrzegam, dużym wkładem w rozprzestrzenianie się bezużytecznych kotów. Nie obwiniam początkujących, ale chcę ich uczyć. Pracownicy i nowicjusze świata, poluzuj hamulce ręczne i ocal planetę !!! 1!
Jeszcze jedna różnica polega na zachowaniu na blokującym pliku wejściowym open()
.
Na przykład, zakładając wejście jest FIFO bez pisarzy, jedno wezwanie nie będzie tarło żadnych programów dziecięcych aż plik wejściowy jest otwarty, a drugi będzie tarło dwa procesy:
prog ... < a_fifo # 'prog' not launched until shell can open file
cat a_fifo | prog ... # 'prog' and 'cat' are running (latter may block on open)
W praktyce rzadko sprawy, z wyjątkiem przypadków wymyślonych. prog
może okresowo rejestrować lub wykonywać pewne prace czyszczące w oczekiwaniu na dane wejściowe, na przykład, co może się zdarzyć, nawet jeśli żadne dane wejściowe nie są dostępne. (Dlaczego nie miałby być wystarczająco zaawansowany, aby otworzyć własne wejście bez blokowania?)
- 1. plik cat bez zawijania wierszy
- 2. File.createTempFile() VS nowy plik()
- 3. shell - cat - scalanie zawartości plików w jeden duży plik
- 4. Zastąp plik tekstowy vs append
- 5. różnica między grep Vs cat i grep
- 6. Adnotacje serwletu 3.0 <plik powitalny>
- 7. * plik * zmienna nie działa
- 8. <%# %> vs <%= %>
- 9. Jak zezwolić na <plik wejściowy = "plik">, aby akceptować tylko pliki graficzne.
- 10. Jak zmienić plik .p12 na plik .key
- 11. Utwórz plik, jeśli plik nie istnieje
- 12. Odtwórz plik WS ramowy plik cookie
- 13. Chciałbym zatrzymać plik zapisujący nośną usuwając plik
- 14. Przekaż plik niestandardowy plik krb5.conf
- 15. który plik .jar ma plik javax.xml.stream. *?
- 16. R: Dlaczego plik read.table przestaje czytać plik?
- 17. plik node.js - plik sparowany przez socket.io
- 18. rekurencyjne cat wszystkie pliki w jednym pliku
- 19. Definiowanie konstruktora w pliku nagłówkowym Plik implementacji VS (.cpp)
- 20. Pozwolenie na plik w linux vs w Windows
- 21. Plik WaIISHost.exe.config vs. App.config dla konfiguracji roli roboczej
- 22. Konwertuj bieżący plik .vssettings na .vstheme dla VS 2013
- 23. Windows: Zastąp plik w użyciu
- 24. Używanie "<typ wejściowy =" plik ".... />" zamiast asp: FileUpload
- 25. Jak mogę sprawdzić <typ wejściowy = "plik"> w Angular2?
- 26. <typ wejściowy = "plik"> - style niestandardowe/css
- 27. Konwertuj listę <images> na plik wideo?
- 28. Jak najlepiej odczytać plik z listy <string>
- 29. Czy można utworzyć ogólny plik Session.QueryOver <T>?
- 30. jak wczytać plik HTML 5 z obrazu (<img>)?
Jeśli pytasz, dlaczego widzisz jedną formę lub inną, używaną w różnych miejscach, wydaje się to być kwestią osobistych preferencji. Kernighan i Pike zauważyli to w 1984 roku: http://www.amazon.com/Unix-Programming-Environment-Prentice-Hall-Software/dp/013937681X – msw
Należy do superuser.com –