Diferença entre | e ||

4

Qual é a diferença entre | e || ?

Quando eu executo este comando:

ls -la | id

Eu recebo o resultado de id

Quando eu executo este comando :

ls -la || id

Eu recebo o resultado de ls -la

Então, qual é a diferença entre eles?

    
por Vendetta 14.07.2016 / 01:46

2 respostas

16

| é o operador pipe, que transmite a saída do primeiro comando para o seguinte.

de man bash :

  

Um pipeline é uma sequência de um ou mais comandos separados pelo caractere |. O formato de um pipeline é:

[time [-p]] [ ! ] command [ | command2 ... ]
     

A saída padrão do comando é conectada através de um pipe à entrada padrão do comando2.

No exemplo que você fornece, id parece não fazer nada com a saída de ls , de modo que apenas retorna a mesma saída que a execução de id sozinho.

|| é o operador OR lógico e especifica o que fazer se o primeiro comando retornar false ou falhar (é diferente de zero).

de man bash :

  

Os operadores de controle & amp; & amp; e || denotar listas AND e listas OR, respectivamente. Uma lista AND tem o formulário

command1 && command2
     

o comando2 é executado se, e somente se, o comando1 retornar um status de saída igual a zero.

     

Uma lista OR tem o formulário

command1 || command2
     

o comando2 é executado se e somente se o comando1 retornar um status de saída diferente de zero. O status de retorno das listas AND e OR é o status de saída do último comando executado na lista.

No seu exemplo, ls -la é executado com êxito, portanto, o comando id não é executado. Se você fez o seguinte:

ls -z || id

e tente passar uma opção inválida z para ls , então ele falhará e o comando id será executado.

    
por amc 14.07.2016 / 01:55
6

| é o operador de pipe. De isto man sh :

  

Um pipeline é uma sequência de um ou mais comandos separados por |. A saída padrão de cada comando, mas a última, é conectada por um pipe (2) à entrada padrão do próximo comando. Cada comando é executado como um processo separado; o shell aguarda o último comando terminar. O valor de um pipeline é o status de saída de seu último comando.

A | B | C

Terá a saída padrão de A (o que ela imprime na tela) e dará a B como entrada padrão, como o que você digitaria em um modo interativo, e B fornecerá seu stdout para C.

history | grep word

history imprime todo o histórico do seu shell, e grep imprime linhas correspondentes a um padrão, portanto, ele encontra todas as entradas no histórico do shell onde você usou word , porque grep lê STDIN quando não é fornecido um nome de arquivo como argumento.

history | tail -n10 | head -n5 

Obtém as 5 primeiras linhas das últimas 10 linhas de history , porque tail e head lêem STDIN quando nenhum nome de arquivo é fornecido.

Por outro lado, || é o operador OR lógico, exatamente equivalente ao mesmo operador em linguagens C e C. Mais uma vez, a partir desse man sh :

  

Os símbolos & amp; & amp; e ||, respectivamente, fazem com que a lista a seguir seja executada apenas se o pipeline anterior retornar um valor zero ou diferente de zero, respectivamente. Novas linhas podem aparecer em uma lista, em vez de ponto e vírgula, para delimitar comandos.

stat filename || echo "no such file or directory" 
stat filename && echo "file exists"

Se stat não encontrar o nome do arquivo, ele retornará um status de saída diferente de zero e, se o fizer, sairá com sucesso com 0. Esse é o inverso de C. Exemplos altamente planejados como stat fornece essas informações de qualquer maneira.)

Estes são essencialmente os mesmos, mas menores que, verificando o status de saída do último comando explicitamente:

stat filename
if [ $? -gt 0 ]; then
  echo "no such file or directory"
fi

etc.

    
por cat 14.07.2016 / 05:01