Sua pergunta está intimamente relacionada a como o shell que você está usando analisa a entrada do usuário na linha de comando.
Se a primeira palavra na linha de comando for um programa, localizado em uma pasta especial (geralmente definida por PATH
) e não houver mais caracteres especiais (depende do shell que você está usando), todas as palavras subsequentes separadas por espaços ou tabulações serão passadas para o programa de uma forma especial, ou seja, uma matriz. Com cada palavra como um elemento na matriz.
Como o programa que você vai chamar interpreta os argumentos (localizados na matriz) depende de como ele é programado. Existem alguns padrões para a aparência da sintaxe dos argumentos, mas em geral o programador é totalmente gratuito. Portanto, o primeiro argumento pode ser interpretado como o nome de um arquivo ou qualquer que seja o pensamento do programador na época em que ele escreveu o programa.
No caso de você adicionar o carácter especial <
ou >
a sua linha de comando, o acréscimo shell dosn't <
e >
nem palavras subseqüentes para a matriz que será passado para o programa. Com <
ou >
dado, o shell começa a criar coisas sofisticadas, suportadas pelo kernel subjacente ( canal de palavras-chave ). Para entender o que está acontecendo, você deve entender o que STDIN
e STDOUT
(já que não está imediatamente relacionado, eu omito STDERR
) são.
Tudo o que você vê no seu terminal (na maioria dos casos, parte do seu monitor) é gravado pelo shell ou por qualquer outro programa que você chamou anteriormente em um arquivo especial (no unix, tudo é um arquivo ). Este arquivo tem um ID especial e é chamado STDOUT
. Se um programa deseja ler dados do teclado, ele não pesquisa diretamente o teclado (pelo menos na maioria dos casos), mas lê de um arquivo especial chamado STDIN
. Internamente, esse arquivo está conectado ao seu dispositivo de entrada padrão, seu teclado na maioria dos casos.
Se o shell lê <
ou >
em uma linha de comando analisada, ele manipula STDIN
ou STDOUT
de um tipo específico pelo tempo em que o programa correspondente está sendo executado. STDIN
e STDOUT
não aponte mais para o terminal ou o dispositivo de entrada padrão, mas para o nome do arquivo subsequente na linha de comando.
No caso das duas linhas
cat file_name
cat < file_name
o comportamento observado é idêntico porque o desenvolvedor correspondente faz cat
para ler dados STDIN
ou ler os dados do arquivo, cujo nome é dado como o primeiro argumento da linha de comando (que é o primeiro elemento na matriz para a qual o shell passa cat
). Posteriormente, cat
grava todo o conteúdo de file_name
ou STDIN
para o terminal, pois não instruímos o shell a manipular STDOUT
. Lembre-se de que na segunda linha seu shell manipula STDIN
dessa maneira, que não aponta mais para o seu dispositivo de entrada padrão, mas aponta para um arquivo chamado file_name
no seu diretório de trabalho atual.
No outro caso da linha
man < file_name
man
não pretende ler nada, STDIN
se for chamado sem argumento, ou seja, uma matriz vazia. Então a linha
man < file_name
é igual a
man
Por exemplo, man
também lerá algo de STDIN
se você passar -l -
para man
. Com esta opção fornecida na linha de comando, você pode exibir o conteúdo de qualquer coisa man
lida STDIN
no seu terminal. então
man -l - < file_name
funcionaria também (mas tenha cuidado man
não é apenas um pager, mas também analisa a entrada do arquivo e, portanto, o conteúdo do arquivo e o conteúdo exibido podem ser diferentes).
Então STDIN
, como STDOUT
e os argumentos da linha de comando são interpretados, tudo depende do desenvolvedor correspondente.
Espero que minha resposta possa esclarecer as coisas.
man -l - < file_name
paraman
interpretarSTDIN
como argumentos, mas ele falha no meu sistema com oSTDERR
:man -l - < tee man: invalid option -- l man, version 1.6c
man
( man-db ) lê argumentosSTDIN
com os argumentos fornecidos,-l
seguidos por-
. Ele apenas interpreta os dadosSTDIN
como uma página de manual. Para explicações mais detalhadas dos argumentos válidos e como eles são interpretados, você deve consultar a página de manual do programa relacionado. No seu caso, consulteman man
. Talvez haja uma opção semelhante para o seuman
. Se você quiser ler os argumentos da linha de comando para um programa específicoSTDIN
xargs
(como mencionado acima), é o caminho a seguir.man man
e o local no meu sistema operacional não o suporta. De qualquer forma, obrigado por esta declaração desses dois conceitos para mim.Eles são completamente diferentes. Os argumentos da linha de comando são passados para o programa em uma matriz e ele pode fazer o que quiser com eles; stdin é um fluxo de entrada do qual o programa solicita dados. Os programas que processam arquivos geralmente optam por oferecer suporte a ambos, mas precisam fazê-lo manualmente - verificam se um nome de arquivo foi passado como argumento da linha de comando e, se não, eles lêem em stdin
Você espera
man
ler stdin para encontrar a página de manual que deve exibir, o que seria um comportamento realmente estranho; quando você usaria isso? O fato decat
exibir seu stdin é um artefato do fato de que ele não faz mais nada; Eu não acho que nenhuma outra ferramenta funcione dessa maneira. Por exemplo,grep
pode pegar um nome de arquivo ou lerstdin
, mas processa os dadosstdin
, não lê um nome de arquivostdin
e, em seguida, abre-oSe você realmente precisar desse comportamento, poderá usar o
xargs
que converte um arquivo em argumentos da linha de comando:Ou apenas incorpore uma
cat
chamada naman
chamada:fonte
man $(<file_name)
.(<>)
em um loop vai fazerSTDIN
ou argumentos de linha de comando como nomes de arquivos ...man < file_name
é me ajudar a entender esses dois conceitos. Lendo sua explicação, a implementação é decidida pelo autor do comando. Então, se eu estiver certo, ofind
argumento leva processa STDIN?