W przypadku niektórych poleceń można podać określone dane wejściowe jako argument stdin lub wiersz poleceń.
W szczególności załóżmy, że command
możemy przyjąć wejście standardowe i nazwę pliku jako argument wiersza poleceń, i command < myfile
, cat myfile | command
i command myfile
może dać ten sam wynik.
Na przykład,
Gdy polecenie brzmi sed
:
sed s/day/night/ <myfile >new
sed s/day/night/ myfile >new
cat myfile | sed s/day/night/ >new
Gdy polecenie brzmi cat
:
cat < myfile
cat myfile
- Zastanawiałem się, czy istnieją jakieś ogólne zasady dotyczące ich występów, tj. Która z nich jest zwykle najbardziej wydajna, a która najmniej?
- Czy przekierowanie jest zawsze lepsze niż potok?
Odpowiedzi:
cat file | command
Składnia jest uważany za Useless użycieCat
. Ze wszystkich opcji wymaga wydajności, ponieważ musi odrodzić inny proces w jądrze. Jakkolwiek nieistotne może się to okazać na dużym obrazie, jest to narzut, którego nie mają inne formy. Zostało to omówione na pytania takie jak: Czy powinienem dbać o niepotrzebne koty?Między pozostałymi dwiema postaciami praktycznie nie ma różnic w wydajności. STDIN to specjalny węzeł pliku, który proces musi otwierać i czytać tak jak każdy inny. Przekazanie nazwy pliku zamiast STDIN powoduje po prostu otwarcie innego pliku.
Różnica polegałaby na tym, jakich funkcji / elastyczności szukasz.
sed -i
do edycji w miejscu. (Uwaga: ponieważ musi to utworzyć nowy plik za kulisami, nie jest to wzrost wydajności w porównaniu z innymi przekierowaniami, ale jest to krok wygody.)sed [exp] < file1 file2
a nawetsed [exp] < <(grep command)
. Szczegóły tego przypadku użycia można znaleźć w tym pytaniu: Podstawienie procesu i potokźródło
sed [exp] < <(grep command)
będzie działał dobrze, ponieważsed [exp] <(grep command)
(ponieważ<(grep command)
tworzy nazwany plik tymczasowy na długość polecenia, którysed
jest w stanie samodzielnie otworzyć się bez pomocy powłoki).Biorąc pod uwagę, że
command file
po prostu otwiera plik i od tego momentu działa tak, jakby byłstdin
, nie ma różnicy. Dzięki przekierowaniu powłoki po prostu wcześniej otwierasz plik (shell robi,) w przeciwieństwie do samego polecenia binarnego.Jeśli mówimy o
cat file | command
kontracommand <file
, to ten drugi jest preferowany. Nie zauważysz znaczącej różnicy wydajności między tymi dwoma, ale ta pierwsza jest niepotrzebnie skomplikowana (dodatkowy proces i bufor pamięci współdzielonej dla potoku, z ograniczoną przepustowością.) Ponadto nie możeszseek
(arbitralnie zmienić pozycji wskaźnika pliku) w potoku, podczas gdy możesz w zwykłym pliku. Niektóre polecenia mogą wykorzystywać bardziej wydajny algorytm, gdyseek
możliwe jest -ing w pliku wejściowym.źródło
<file
? Twoje uzasadnienie dotyczy używania nazwy pliku wejściowego do wyprowadzania trudnej nazwy pliku wyjściowego, np .:gzip file
produkujefile.gz
.close
ówstdin
i połączeńdup
na otwartym deskryptorze pliku, więc zastąpić starystdin
(który był jakiś tty w większości przypadków). Z punktu odtwarzacz filmów widzenia nie ma różnicy między tym i otwierania pliku przez jego nazwę w sam gracz. Deskryptor pliku jest widoczny w obu scenariuszach, więc kiedy przejdziemy do końca, nie będzie żadnej zauważalnej przez użytkownika różnicy.