Sintaxis de Linux Bash: Significado de &&, \ y -

14

¿Qué significan ' &&', ' \' y ' -' al final de los comandos bash?

En particular, me encontré con la siguiente combinación de líneas que se supone que agregan claves públicas al administrador de paquetes de aptitud de Ubuntu, ¿para qué se usan esos caracteres aquí?

    gpg --keyserver keyserver.ubuntu.com --recv 26C2E075 && \
    gpg --exportar - armadura 26C2E075 | sudo apt-key add - && \
    sudo apt-get update
Alex
fuente
"/" no es lo mismo que "\"
Thomas
Thomas: reparó su publicación
Kyle Brandt
Las barras invertidas aquí no son necesarias ya que && también será suficiente para implicar la continuación de la línea. Sin embargo, el uso de la barra diagonal inversa ayuda a la legibilidad.
Pausado hasta nuevo aviso.

Respuestas:

37

"&&" se usa para encadenar comandos, de modo que el siguiente comando se ejecuta si y solo si el comando anterior salió sin errores (o, más exactamente, sale con un código de retorno de 0).

"\" en sí mismo al final de una línea es un medio para concatenar líneas juntas. Entonces las dos líneas siguientes:

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

se procesan exactamente igual que si la línea se escribiera como una sola línea:

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

"-" es un argumento de línea de comando sin función bash específica. La forma exacta en que se maneja depende del comando que se ejecuta (en este caso, apt-key ). Dependiendo del contexto, generalmente se usa para indicar " leer datos de stdin en lugar de un archivo " o " procesar el resto de la línea como datos en lugar de como argumentos de línea de comandos ".

goldPseudo
fuente
55
En este caso, '-' no es un parámetro de sudo sino de 'apt-key', lo que significa que en lugar de un archivo de clave, 'apt-key' está utilizando los datos que llegan a través de la tubería ('|') a su stdin como una llave La opción "gpg --export", sin tener '--output a_file_name.key', empuja una nueva clave fuera del gpg stdout, a través de la tubería ('|') al stdin de 'apt-key' Fácil: - )
edomaur
2
gritos eso es lo que obtengo por responder preguntas mientras estoy medio dormido. fijo.
goldPseudo
7
&& == 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)
rodjek
fuente
6

&& es el AND lógico:
&& es una forma de expresar AND lógico , lo que significa que toda la expresión es True solo si ambos lados son verdaderos. En lógica, se dice que toda la declaración (P&Q) solo es verdadera cuando tanto P como Q son verdaderas.

Como consecuencia de esto, las computadoras generalmente tratan a P&Q como una evaluación de cortocircuito . Entonces, dado que toda la declaración solo será Verdadera si P y Q son verdaderas, entonces si P es falsa, la declaración Q no se evalúa . Básicamente, las computadoras son perezosas (eficientes) y no se molestan en evaluar Q si no lo tienen también. Esto también es cierto para el OR lógico, consulte el enlace anterior.

Los tres contextos de && en Bash:

1) Uso de la evaluación de cortocircuito con el estado de salida de un comando:
cada comando tiene un estado de salida. Si un comando tiene un error, tiene un estado de salida que no es cero. Entonces, si el estado de salida no es cero y && se usa para encadenar comandos en una declaración, los comandos posteriores no se evaluarán (ejecutarán) si el anterior no tenía un estado de salida de 0 (Verdadero). Esto se debe a la evaluación de cortocircuito. Entonces si tienes:

P && Q

Q no se ejecutará si P no es verdadero (si P sale con un estado que no sea 0, no es cierto). Igual que:

./configure && make

make no se ejecutará si configure tuvo un error, no era cierto. Entonces, básicamente, termina siendo una forma de escribir en la declaración if if:

if ./configure ; then
   make
fi

Tenga en cuenta que, en la mayoría de los contextos, 0 es falso, pero no cuando se trata de un estado de salida.

2) && se puede usar en el comando de prueba integrado [[]] de Bash:

&& también se puede usar dentro del comando de prueba incorporado en bash [[]] para combinar expresiones de manera similar a la combinación de comandos. Toda la operación de prueba solo será verdadera si ambos operandos (lados) de && son verdaderos, por ejemplo:

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

sería una forma de decir si $ a es un número entero entre 2 y 5 (sin incluir 2 y 5).

3) Evaluación aritmética:

Por último, && se puede usar en la evaluación aritmética como AND lógico. Si los dos (lógicos Y) de los siguientes números no son cero, devuelve 0, de lo contrario se devuelve 1:

kbrandt@desktop:~/$ echo $((1 & 1))
1
kbrandt@desktop:~/$ echo $((0 && 1))
0
Kyle Brandt
fuente
@ Kyle: && utilizado fuera de una expresión lógica es el "operador AND control", comportamiento similar pero técnicamente diferente
drAlberT
No sigas tu comentario, ¿qué quieres decir fuera de una expresión lógica?
Kyle Brandt
Quiero decir que, en una expresión, el operador de control && asume la media de "lógico y", de lo contrario es solo un "y". Es el "operador de control AND", utilizado en las listas. Los operadores lógicos se utilizan en el contexto de la expansión aritmética, dentro de las expresiones.
drAlberT
En el if [./configure]ejemplo, debe quitar los corchetes. Lo correcto esif ./configure; then make...
Juliano
Juliano, buena captura, se actualizará. AlberT, ¿hay alguna diferencia aparte de los términos que le dan las páginas del manual?
Kyle Brandt
3

Creo que será mejor con una explicación del significado "real", las implicaciones son otra cosa :)

  • && es el operador de control "Y". De bash man :
    Los operadores de control && y || denotar listas AND y listas OR, respectivamente.
    Una lista AND tiene la forma  
        comando1 && comando2     
    command2 se ejecuta si, y solo si, command1 devuelve un estado de salida de cero.
    [..cortar..]
    El estado de retorno de las listas AND y OR es el estado de salida del último comando
    ejecutado en la lista.
    
    Un operador de control es
    Un token que realiza una función de control. Es uno de los siguientes símbolos:
        || & &&; ;; () |
    
  • \es el " carácter de escape ", y es uno de los tres mecanismos de comillas disponibles en bash:
    CITA
       Las comillas se usan para eliminar el significado especial de ciertos caracteres o palabras al shell.
    [..cortar..]
       Hay tres mecanismos de comillas: el carácter de escape, comillas simples y comillas dobles.
       Una barra invertida no citada (\) es el carácter de escape. Conserva el valor literal del siguiente carácter que sigue, con la excepción de. Si aparece un \ pair, y la barra diagonal inversa no se cita, el \ se trata como una continuación de línea (es decir, se elimina de la secuencia de entrada y se ignora efectivamente).
    [..cortar..]
    La barra invertida conserva su significado especial solo cuando es seguida por uno de los siguientes caracteres: $, `,", \ o.
    
    Esto significa que si coloca un carácter de escape (el "\") al final de una línea, de hecho está escapando del nuevo carácter de línea que lo sigue inmediatamente (el carácter de RETORNO) con el efecto de "continuar la línea" otros ya han explicado en su respuesta
  • El guión del guión " - " que algunos comandos aceptan como parámetro es una convención, no un char especial u operador. Como ya señaló otro, es una especie de marcador de lugar para las secuencias de E / S estándar. Dependiendo del programa al que nos refiramos, puede permanecer para stdin (la entrada estándar) o stdout (la salida estándar).

Mis 2 centavos

drAlberT
fuente
1
Probablemente va a ser un caso de tl; dr. Pegar trozos gigantes de una página de manual, por más esclarecedor que sea, probablemente intimidará al OP.
rodjek