Funkcjonalnie (pod względem wydajności), te dwa są takie same. Pierwszy z nich faktycznie tworzy oddzielny proces, który po prostu wysyła zawartość pliku na standardowe wyjście, które pojawia się na standardowym wejściu grep
, ponieważ powłoka połączyła je z rurą.
W tym sensie grep regex <filename
jest również równoważny, ale z jednym procesem mniej.
Jeżeli zaczniesz widzieć różnica jest w wariantach, gdy dodatkowa informacja (nazwy plików) jest wykorzystywane przez grep
, takie jak z:
grep -n regex filename1 filename2
Różnica między tym a:
cat filename1 filename2 | grep -n regex
jest to, że były wie o poszczególnych plikach natomiast ostatni widzi go jako jeden pliku (bez nazwy).
Choć dawny może dać Ci:
filename1:7:line with regex in 10-line file
filename2:2:another regex line
ten ostatni będzie więcej takich jak:
7:line with regex in 10-line file
12:another regex line
Innym wykonywalny, który działa odmiennie, jeśli zna nazw plików jest wc
The programy liczników słów:
$ cat qq.in
1
2
3
$ wc -l qq.in # knows file so prints it
3 qq.in
$ cat qq.in | wc -l # does not know file
3
$ wc -l <qq.in # also does not know file
3
+1: pedant (np ja) mogą twierdzić, że 'cat' zawsze pisze na standardowe wyjście, ale w kontekst potoku, jego standardowym wyjściem jest koniec zapisu rury. Podobnie, gdy 'grep' jest wywoływany bez argumentów nazw plików lub gdy przetwarza argument nazwy pliku' -', to odczyta jego standardowe wejście, które w tym przypadku jest odczytanym końcem potoku. Zauważ, że 'pipe' lub' | 'nie jest poleceniem; nie jest całkiem jasne, czy rozpoznajesz, że "tak potok przekazuje dane wejściowe jako wynik do nowego procesu powłoki". –