Sintaxe de bash do Linux: Significado de &&, \ e -

13

O que significam ' && ', ' \ ' e ' - ' no final dos comandos bash?

Em particular, me deparei com a seguinte combinação de linhas que deveriam adicionar chaves públicas ao gerenciador de pacotes aptitude do Ubuntu, quais são os caracteres usados aqui?
    gpg --keyserver keyserver.ubuntu.com --recv 26C2E075 && \
    gpg --export --armor 26C2E075 | sudo apt-key add - && \
    sudo apt-get update
    
por Alex 13.08.2009 / 07:54

4 respostas

32

"& &" é usado para encadear comandos juntos, de modo que o próximo comando seja executado se e somente se o comando anterior sair sem erros (ou, mais precisamente, sair com um retorno código de 0).

"\" por si só no final de uma linha é um meio de concatenar linhas juntas. Então as duas linhas seguintes:

gpg --keyserver keyserver.ubuntu.com --recv 26C2E075 && \
gpg --export --armor 26C2E075

são processados exatamente da mesma forma como se a linha fosse escrita como a única linha:

gpg --keyserver keyserver.ubuntu.com --recv 26C2E075 && gpg --export --armor 26C2E075

"-" é um argumento de linha de comando sem nenhuma função específica do bash. Exatamente como ele é manipulado depende do comando que está sendo executado (neste caso, apt-key ). Dependendo do contexto, ele é normalmente usado para indicar " dados de leitura de stdin em vez de um arquivo ", ou " processa o restante da linha como dados em vez de argumentos de linha de comando ".

    
por 13.08.2009 / 08:06
6
&& == if the first command succeeded, run the next one
\ == the next line is part of the first line, not two seperate lines
- == read the input from stdin (console)
    
por 13.08.2009 / 08:00
6

& & É o AND lógico:
& & é uma maneira de expressar E lógico , significando que a expressão inteira é verdadeira somente se ambos os lados dela forem verdade. Na lógica, diz-se que a declaração inteira (P & Q) só é verdadeira quando P e Q são verdadeiros.

Como consequência disso, os computadores geralmente tratam a P & Q como uma avaliação de curto-circuito . Então, uma vez que toda a declaração será apenas True se P e Q forem verdadeiros, então, se P for falso, a instrução Q não será avaliada. Basicamente, os computadores são preguiçosos (eficientes) e não se incomodam em avaliar Q se eles também não tiverem. Isso também é verdadeiro da OR lógica, veja o link anterior.

Os três contextos de & & no Bash:

1) Usando avaliação de curto-circuito com o status de saída de um comando:
Todo comando tem um status de saída. Se um comando tiver um erro, ele terá um status de saída diferente de zero. Portanto, se o status de saída for diferente de zero e & & é usado para encadear comandos em uma instrução, os comandos posteriores não serão avaliados (executados) se o anterior não tiver um status de saída igual a 0 (True). Isso é por causa da avaliação de curto-circuito. Então, se você tem:

P && Q

Q não será executado se P não for verdadeiro (se P sair com um status diferente de 0, isso não é verdade). Apenas o mesmo que:

./configure && make

make não será executado se o configure tiver um erro, não é verdade. Então, basicamente, acaba sendo uma maneira de escrever na declaração if:

if ./configure ; then
   make
fi

Tenha em mente que, na maioria dos contextos, 0 é falso, mas não quando se trata de um status de saída.

2) & & Pode ser usado no comando [[]] test do Bash:

& & Também pode ser usado dentro do comando de teste embutido no bash [[]] para combinar expressões de maneira similar à combinação de comandos. Toda a operação de teste só será verdadeira se ambos os operandos (lados) de & & são verdadeiras, por exemplo:

if [[ ( $a -gt 2 ) && ( $a -lt 5 ) ]]; then ... 

seria uma maneira de dizer se $ a é um inteiro entre 2 e 5 (não incluindo 2 e 5).

3) Avaliação Aritmética:

Por fim, & & pode ser usado na avaliação aritmética como Logical AND. Se ambos (AND lógico) dos números a seguir forem diferentes de zero, retornará 0, senão 1 será retornado:

kbrandt@desktop:~/$ echo $((1 & 1))
1
kbrandt@desktop:~/$ echo $((0 && 1))
0
    
por 13.08.2009 / 13:48
3

Eu acho que você será melhor com uma explicação do significado "real", implicações são outra coisa:)

  • & & é o operador de controle "AND". De bash man :
    The control operators && and || denote AND lists and OR lists, respectively.
    An AND list has the form  
        command1 && command2     
    command2 is executed if, and only if, command1 returns an exit status of zero.
    [..cut..]
    The return status of AND and OR lists is the exit status of the last command
    executed in the list.
    
    Um operador de controle é
    A token that performs a control function.  It is one of the following symbols:
        || & && ; ;; ( ) | 
    
  • \ é o " caractere de escape ", e é um dos três mecanismos de cotação disponíveis no bash:
    QUOTING
       Quoting is used to remove the special meaning of certain characters or words to the shell.
    [..cut..]
       There are three quoting mechanisms: the escape character, single quotes, and double quotes.
       A  non-quoted  backslash (\) is the escape character.  It preserves the literal value of the next character that follows, with the exception of .  If a \ pair appears, and the backslash is not itself quoted, the \ is treated as a line continuation (that is, it is removed from the input stream and effectively ignored).
    [..cut..]
    The backslash retains its special meaning only when followed by one of the following characters: $, ', ", \, or .
    
    Isto significa que se você colocar um caractere de escape (o "\") no final de uma linha você está de fato escapando da nova linha char que imediatamente o segue (o caracter RETURN) efeito de "continuar a linha" outros já explicaram em sua resposta
  • O caractere de traço " - " que alguns comandos aceitam como parâmetro é uma convenção, não um operador ou caractere especial do shell. Como outros já apontaram, é uma espécie de marcador de lugar para os fluxos de E / S padrão. Dependendo do programa, referimo-nos a ele pode permanecer por stdin (a entrada padrão) ou stdout (a saída padrão).

Meus 2 centavos

    
por 13.08.2009 / 10:52

Tags