pipe no shell com redirecionamento

1

Meu entendimento é que um canal no shell como a | b redireciona o stdin de b para o stdout de a . No entanto, eu tentei ls | less < somefile , o comportamento é muito estranho. less mostra a saída de ls concatenada pelo conteúdo de somefile .

Alguém poderia explicar esse fenômeno?

    
por Rankaba 29.03.2015 / 12:13

3 respostas

3

Seu entendimento não está correto. Em a | b , a saída stdout do processo a conectado por meio de um pipe a stdin do processo b . O problema com o seu código é que, com um redirecionamento adicional de somefile para processar b , você usará dois métodos diferentes ao mesmo tempo para se conectar ao stdin do processo b . Não faça isso! A questão é; o que você tenta alcançar (com tal constructo) em primeiro lugar?

    
por 29.03.2015 / 12:19
3

Você não diz qual shell está usando. Do comportamento que você está descrevendo, é provável que zsh . Se você der uma olhada em sua página man, você perceberia como os redirecionamentos são tratados.

Note that a pipe is an implicit redirection; thus

  cat bar | sort <foo

is equivalent to cat bar foo | sort (note the order of the inputs).

Caso contrário, um comportamento regular, por exemplo, aquele de bash , é que cada redirecionamento substitui o redirecionamento anterior para esse descritor de arquivo.

A página do

zsh man continua:

If the MULTIOS option is unset, each redirection replaces the previous redirection for that file descriptor. However, all files redirected to are actually opened, so

  echo foo > bar > baz

when MULTIOS is unset will truncate bar, and write 'foo' into baz.

    
por 29.03.2015 / 12:51
1

porque você está aceitando menos de algum arquivo.

funciona assim

1 - > execute ls, como você usou pipe, ele irá stdout para stdin do próximo comando: isto é o que você está dizendo

2 - > vai parecer segundo comando .. é menos < somefile

assim que for exibido '<' redirecionamento ele irá mudar stdin novamente para o arquivo ... Daí sua mudança anterior por causa de '|' está se perdendo.

bem, você pode dizer assim: menos tomaram entrada do arquivo, não tem nada a ver com a saída de ls.

    
por 22.08.2015 / 15:25