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
man
( man-db ) odczytuje argumentySTDIN
z podanymi argumentami,-l
po których następuje-
. Po prostu interpretuje dane zeSTDIN
strony podręcznika. Aby uzyskać bardziej szczegółowe wyjaśnienia poprawnych argumentów i ich interpretacji, należy zajrzeć na stronę podręcznika odpowiedniego programu. W twoim przypadku skonsultuj sięman man
. Może istnieje podobna opcja dla twojegoman
. Jeśli chcesz odczytać argumenty wiersza poleceń dla określonego programu zSTDIN
xargs
(jak wspomniano powyżej), jest to droga.man man
znajduję ten w moim systemie operacyjnym, który go nie obsługuje. W każdym razie dziękuję za tę deklarację tych dwóch koncepcji.Oni są zupełnie inni. Argumenty wiersza polecenia są przekazywane do programu w tablicy i może on robić z nimi, co chce; stdin to strumień wejściowy, od którego program musi żądać danych. Programy, które przetwarzają pliki często wybierają obsługę obu, ale muszą to zrobić ręcznie - sprawdzają, czy nazwa pliku została przekazana jako argument wiersza polecenia, a jeśli nie, zamiast tego czytają ze standardowego wejścia
Wygląda na to, że spodziewasz
man
się przeczytać standardowe wejście, aby znaleźć stronę podręcznika, którą powinien wyświetlić, co byłoby naprawdę dziwnym zachowaniem; kiedy miałbyś tego użyć? Fakt, żecat
wyświetla swoje standardowe wejście, jest artefaktem tego, że nie robi nic innego; Nie sądzę, aby inne narzędzie działało w ten sposób. Na przykładgrep
może pobrać nazwę pliku lub odczytaćstdin
, ale przetwarza danestdin
, nie odczytuje nazwy plikustdin
a następnie go nie otwieraJeśli naprawdę potrzebujesz takiego zachowania, możesz użyć
xargs
, który konwertuje plik na argumenty wiersza poleceń:Lub po prostu osadzić
cat
połączenie wman
połączeniu:źródło
man $(<file_name)
.(<>)
w pętli zrobiSTDIN
argumenty wiersza poleceń jako nazwy plików ...man < file_name
jest zrozumienie tych dwóch pojęć. Po przeczytaniu wyjaśnienia o implementacji decyduje autor polecenia. Więc jeśli mam rację,find
argumenty bierze raczej przetwarza STDIN?