less command com pipe

3

Eu aprendo que o pipe ( | ) é usado para passar o stdout para o stdin do subshell.

Mas, o comando less deve ter um argumento de nome de arquivo como less file1.txt

No entanto, quando eu uso o comando como ls -l /root | less , funciona.

Então, eu assumi que, neste caso, menos leva stdin arquivo , que é escrito a partir do stdout de ls -l /root . Quero dizer, em real, less stdin quando menos faz o seu próprio comando. Mas, por causa de outro comando, fiquei confuso. É o comando tr .

O comando

tr não aceita nenhum argumento arquivo como tr a-z A-Z file1.txt . É só pegar stdin do teclado ou stdin redirecionado. Mas, o comando ls -l /root | tr a-z A-Z é possível. Então, o que eu assumi está errado.

Como o tubo funciona em real? O básico é que o tubo passa a saída padrão do shell principal para a entrada padrão do subshell. Mas, eu não posso saber que a saída padrão do shell principal vai para a entrada padrão do subshell arquivo ou apenas leva uma situação em que eu insiro os caracteres do teclado. Mas, quando vejo exemplos acima, o shell usa as duas situações.

    
por A.Cho 21.02.2016 / 08:54

2 respostas

2

So, I assumed that in this case, less takes stdin file which is written from ls -l /root's stdout.

Isso está correto e não contradiz o que você observou com tr .

A construção pipeline do shell ( PRODUCER | CONSUMER ) cria um can pipe anônimo antes de iniciar os dois processos PRODUCER e CONSUMER . Um canal anônimo é um tipo de arquivo que não tem nome, não possui uma entrada de diretório, mas pode ser lido e gravado normalmente. Em um pipeline, o shell conecta a extremidade de gravação do pipe ao stdout do produtor e a extremidade de leitura do pipe ao stdin do consumidor.

O comando tr só lê dados de stdin e grava em stdout. O comando less faz isso somente se você não passar um nome de arquivo na linha de comando; se você passar um nome de arquivo para less , ele lerá desse arquivo em vez de ler de stdin. O que o less faz é uma convenção comum, seguida por muitos aplicativos semelhantes que lêem dados de um arquivo.

Você também pode ter interesse em que se entende conectando STDOUT e STDIN? e Como um comando pode ter mais de uma saída?

    
por 22.02.2016 / 01:16
4

I learn that pipe (|) is used to pass stdout into subshell's stdin.

Ele passa o stdout do comando da esquerda para o stdin do comando da direita. Se um ou ambos os comandos são executados em um subshell, a implementação do shell é específica.

Em qualquer caso, o shell não se preocupa com argumentos sendo passados ou não para os comandos. Cabe aos programas fazer o que quiserem com seus stdin e stdout, incluindo ignorá-los.

Note também que os programas são capazes de detectar se o seu stdin é um tty , ou seja, um teclado interativo, ou não e agir de acordo. Isso é o que você observa com o comando less , que, quando não recebe argumentos, normalmente lê sua entrada padrão, mas se recusa a processá-la se for um tty , como seu software é .com / less / download.html "> código-fonte mostra:

  if (isatty(fd0))
  {
    error("Missing filename (\"less --help\" for help)", NULL_PARG);
    quit(QUIT_OK);
  }
    
por 21.02.2016 / 09:17