Sintaxe do Linux Bash: significado de &&, \ e -


14

O que significam ' &&', ' \' e ' -' no final dos comandos do 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, para que servem esses caracteres aqui?

    gpg --keyserver keyserver.ubuntu.com - rcv 26C2E075 && \
    gpg --export --armor 26C2E075 | sudo apt-key add - && \
    sudo apt-get update

"/" não é o mesmo que "\"
Thomas

Thomas: Corrigido seu post
Kyle Brandt

As barras invertidas aqui não são necessárias, pois o && também será suficiente para implicar a continuação da linha. Usar a barra invertida, no entanto, ajuda na legibilidade.
Pausado até novo aviso.

Respostas:


37

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

"\" por si só no final de uma linha é um meio de concatenar linhas juntas. Portanto, as duas linhas a seguir:

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

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

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

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


5
Nesse caso, '-' não é um parâmetro do sudo, mas de 'apt-key', o que significa que, em vez de um arquivo de chave, 'apt-key' está usando os dados que passam pelo canal ('|') para seu stdin como uma chave. A opção "gpg --export", sem ter '--output a_file_name.key', empurre uma nova chave para fora do gpg stdout, através do canal ('|') até o stdin de 'apt-key' Easy: - )
edomaur

2
gritos. é isso que recebo por responder perguntas enquanto estou dormindo. fixo.
goldPseudo

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)

6

&& É o AND lógico:
&& é uma maneira de expressar AND lógico , o que significa que toda a expressão é True somente se os dois lados forem verdadeiros. Em lógica, diz-se que a afirmação inteira (P&Q) só é verdadeira quando P e Q são verdadeiros.

Como conseqüência disso, os computadores geralmente tratam o P&Q como uma avaliação de curto-circuito . Portanto, como a declaração inteira será verdadeira apenas se P e Q forem verdadeiros, se P for falso, a declaração Q não será avaliada . Basicamente, os computadores são preguiçosos (eficientes) e não se incomodam em avaliar o Q, se não tiverem também. Isso também é verdadeiro para OR lógico, consulte o link anterior.

Os três contextos de && no Bash:

1) Usando a 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 && for usado para encadear comandos juntos em uma instrução, os comandos posteriores não serão avaliados (executados) se o anterior não tiver o status de saída 0 (True). Isso ocorre devido à 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 igual a 0, não é verdade). Da mesma forma que:

./configure && make

O make não será executado se o configure tiver um erro, não for verdadeiro. Então, basicamente, acaba sendo uma maneira de escrever a declaração if then:

if ./configure ; then
   make
fi

Lembre-se de 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 de teste incorporado [[]] do Bash:

&& Também pode ser usado dentro do comando de teste interno no bash [[]] para combinar expressões de maneira semelhante à combinação de comandos. Toda a operação de teste será verdadeira apenas se os dois operandos (lados) de && forem verdadeiros, por exemplo:

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

seria uma maneira de dizer se $ a é um número 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 AND lógico. Se os dois (AND lógico) dos números a seguir forem diferentes de zero, ele retornará 0, caso contrário 1 será retornado:

kbrandt@desktop:~/$ echo $((1 & 1))
1
kbrandt@desktop:~/$ echo $((0 && 1))
0

@Kyle: && usado fora de uma expressão lógica é a "E operador de controle", comportamento semelhante, mas tecnicamente diferente
drAlberT

Não siga o seu comentário, o que você quer dizer com uma expressão lógica?
22630 Kyle Brandt

Quero dizer que, em uma expressão, o operador de controle && assume a média de "lógico e", caso contrário, é apenas um "e". É o "operador de controle AND", usado nas listas. operadores lógicos são usados ​​no contexto de expansão aritmética, dentro de expressões.
drAlberT

no if [./configure]exemplo, você deve remover os colchetes. O correto éif ./configure; then make...
Juliano

Juliano, Boa captura, será atualizado. AlberT, existe alguma diferença além dos termos que as páginas de manual fornecem?
Kyle Brandt

3

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

  • && é o operador de controle "AND". Do bash man :
    Os operadores de controle && e || denotam listas AND e OR, respectivamente.
    Uma lista AND tem o formato  
        command1 && command2     
    command2 é executado se, e somente se, command1 retorna um status de saída igual a zero.
    [..cortar..]
    O status de retorno das listas AND e OR é o status de saída do último comando
    executado na lista.
    
    Um operador de controle é
    Um token que executa uma função de controle. É um dos seguintes símbolos:
        || & &&; ;; ()
    
  • \é o " caractere de escape " e é um dos três mecanismos de citação disponíveis no bash:
    CITAÇÕES
       A citação é usada para remover o significado especial de certos caracteres ou palavras do shell.
    [..cortar..]
       Existem três mecanismos de citação: o caractere de escape, aspas simples e aspas duplas.
       Uma barra invertida não citada (\) é o caractere de escape. Ele preserva o valor literal do próximo caractere a seguir, com exceção de. Se um \ pair aparecer e a barra invertida não for citada, o \ será tratado como uma continuação de linha (ou seja, é removido do fluxo de entrada e efetivamente ignorado).
    [..cortar..]
    A barra invertida mantém seu significado especial somente quando seguido por um dos seguintes caracteres: $, `,", \ ou.
    
    Isso significa que, se você colocar um caractere de escape (o "\") no final de uma linha, estará escapando do novo caractere de linha que o segue imediatamente (o caractere RETURN), com o efeito de "continuar a linha" outros já explicaram em sua resposta
  • O traço char " - " que alguns comandos aceitam como parâmetro é uma convenção, não um caractere ou operador especial do shell. Como outro já apontado, é uma espécie de marcador de local para os fluxos de E / S padrão. Dependendo do programa a que nos referimos, ele pode ficar para stdin (a entrada padrão) ou stdout (a saída padrão).

Meus 2 centavos


1
Provavelmente vai ser um caso de tl; dr. Colar pedaços gigantes de uma página de manual - por mais esclarecedora que seja - provavelmente intimidará o OP.
Rodjek 13/08/09
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.