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 STDINlub STDOUTw szczególny sposób na czas działania odpowiedniego programu.STDINi STDOUTnie 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 catalbo odczytuje dane, STDINalbo 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 catzapisuje całą zawartość file_namelub STDINdo terminala, ponieważ nie instruujemy powłoki, aby manipulowała STDOUT. Pamiętaj, że w drugim wierszu twoja powłoka manipuluje STDINw ten sposób, aby nie wskazywała na żadne standardowe urządzenie wejściowe, ale wskazuje na plik wywołany file_namew bieżącym katalogu roboczym.
W drugim przypadku linii
man < file_name
mannie ma na celu odczytania niczego, STDINjeśli jest wywoływane bez argumentu, tj. pusta tablica. Więc linia
man < file_name
równa się
man
Na przykład też mancoś odczyta STDIN, jeśli przejdziesz -l -do man. Dzięki tej opcji podanej w wierszu poleceń możesz wyświetlić zawartość dowolnego manodczytu z STDINtwojego 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_nameabymaninterpretujeSTDINjako argumenty, ale to nie w moim systemie zSTDERR:man -l - < tee man: invalid option -- l man, version 1.6c