Twoje pytanie jest ściśle związane z tym, jak używana powłoka analizuje dane wprowadzone przez użytkownika w wierszu poleceń.
Jeśli pierwszym słowem w wierszu poleceń jest program, umieszczony w specjalnym folderze (głównie zdefiniowanym przez PATH
) i nie podano już żadnych znaków specjalnych (w zależności od używanej powłoki), wszystkie kolejne słowa oddzielone spacjami lub tabulatorami są przekazywane do program w specjalnej formie, tj. tablica. Z każdym słowem jako jednym elementem w tablicy.
Sposób, w jaki program, który zamierzasz wywołać, interpretuje argumenty (znajdujące się w tablicy) zależy od tego, jak jest programowany. Istnieje kilka quasi-standardów, jak powinna wyglądać składnia argumentów, ale ogólnie programista jest całkowicie darmowy. Zatem pierwszy argument można interpretować jako nazwę pliku lub cokolwiek innego, o czym myśli programista w czasie, gdy pisał program.
W przypadku dodawania znaku specjalnego <
lub >
do linii poleceń, append shell dosn't <
i >
ani kolejne słowa do tablicy, która zostanie przekazana do programu. Z <
lub >
podana powłoka zaczyna wymyślać fantazyjne rzeczy, wspierane przez leżące u jej podstaw jądro (słowa kluczowe piping ). Aby zrozumieć, co się dzieje, musisz zrozumieć, coSTDIN
i STDOUT
(ponieważ nie jest to bezpośrednio powiązane, pomijam STDERR
).
Wszystko, co widzisz na swoim terminalu (w większości przypadków część ekranu) jest zapisywane przez powłokę lub inny program, który wcześniej wywołałeś do specjalnego pliku (w unixie wszystko jest plikiem ). Ten plik ma specjalny identyfikator i nazywa się STDOUT
. Jeśli program chce odczytać dane z klawiatury, nie sonduje bezpośrednio klawiatury (przynajmniej w większości przypadków), ale czyta ze specjalnego pliku o nazwie STDIN
. Ten plik jest wewnętrznie podłączony do standardowego urządzenia wejściowego, w większości przypadków do klawiatury.
Jeśli powłoka odczytuje <
lub >
w parsowanym wierszu poleceń, manipuluje STDIN
lub STDOUT
w szczególny sposób na czas działania odpowiedniego programu.STDIN
i STDOUT
nie wskazuje już terminala ani standardowego urządzenia wejściowego, ale raczej kolejną nazwę pliku w wierszu poleceń.
W przypadku dwóch linii
cat file_name
cat < file_name
obserwowane zachowanie jest identyczne, ponieważ odpowiedni programista cat
albo odczytuje dane, STDIN
albo odczytuje dane z pliku, którego nazwa jest podana jako argument pierwszego wiersza poleceń (który jest pierwszym elementem tablicy przekazywanej przez powłokę cat
). Następnie cat
zapisuje całą zawartość file_name
lub STDIN
do terminala, ponieważ nie instruujemy powłoki, aby manipulowała STDOUT
. Pamiętaj, że w drugim wierszu twoja powłoka manipuluje STDIN
w ten sposób, aby nie wskazywała na żadne standardowe urządzenie wejściowe, ale wskazuje na plik wywołany file_name
w bieżącym katalogu roboczym.
W drugim przypadku linii
man < file_name
man
nie ma na celu odczytania niczego, STDIN
jeśli jest wywoływane bez argumentu, tj. pusta tablica. Więc linia
man < file_name
równa się
man
Na przykład też man
coś odczyta STDIN
, jeśli przejdziesz -l -
do man
. Dzięki tej opcji podanej w wierszu poleceń możesz wyświetlić zawartość dowolnego man
odczytu z STDIN
twojego terminala. Więc
man -l - < file_name
też by działał (ale bądź ostrożny man
to nie tylko pager, ale także analizuje dane wejściowe pliku, więc zawartość pliku i wyświetlana treść mogą się różnić).
Więc jak STDIN
,STDOUT
a argumenty wiersza polecenia są interpretowane jest wszystko do odpowiedniego dewelopera.
Mam nadzieję, że moja odpowiedź może wyjaśnić.
man -l - < file_name
abyman
interpretujeSTDIN
jako argumenty, ale to nie w moim systemie zSTDERR
:man -l - < tee man: invalid option -- l man, version 1.6c