Sintassi di Bash Linux: significato di &&, \ e -


14

Cosa significano ' &&', ' \' e ' -' alla fine dei comandi bash?

In particolare, mi sono imbattuto nella seguente combinazione di righe che dovrebbero aggiungere chiavi pubbliche al gestore di pacchetti aptitude di Ubuntu, a cosa servono questi personaggi?

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

"/" non è lo stesso di "\"
Thomas,

Thomas: risolto il suo incarico
Kyle Brandt il

Le barre rovesciate qui non sono necessarie in quanto anche il&& sarà sufficiente per implicare la continuazione della linea. L'uso della barra rovesciata, tuttavia, aiuta nella leggibilità.
In pausa fino a ulteriore avviso.

Risposte:


37

"&&" viene utilizzato per concatenare i comandi insieme, in modo tale che il comando successivo venga eseguito se e solo se il comando precedente è uscito senza errori (o, più precisamente, esce con un codice di ritorno 0).

"\" da solo alla fine di una linea è un mezzo per concatenare le linee insieme. Quindi le seguenti due righe:

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

vengono elaborati esattamente come se la riga fosse scritta come riga singola:

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

"-" è un argomento della riga di comando senza alcuna funzione bash specifica. Il modo esatto in cui viene gestito dipende dal comando in esecuzione (in questo caso apt-key ). A seconda del contesto, viene in genere utilizzato per indicare " leggere i dati da stdin anziché da un file " o " elaborare il resto della riga come dati anziché come argomenti della riga di comando ".


5
In questo caso, '-' non è un parametro di sudo ma di 'apt-key', il che significa che invece di un file chiave, 'apt-key' sta usando i dati che arrivano attraverso la pipe ('|') al suo stdin come chiave. L'opzione "gpg --export", senza avere '--output a_file_name.key', spinge una nuova chiave fuori dallo stdout di gpg, attraverso la pipe ('|') fino allo stdin di 'apt-key' Easy: - )
edomaur,

2
whoops. questo è quello che ottengo rispondendo alle domande mentre dormo mezzo. fisso.
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)

6

&& è l'AND logico:
&& è un modo di esprimere l' AND logico , il che significa che l'intera espressione è vera solo se entrambi i lati sono veri. In logica, si dice che l' intera affermazione (P&Q) è vera solo quando P e Q sono veri.

Di conseguenza, i computer in genere trattano P&Q come una valutazione di corto circuito . Quindi, poiché l'intera istruzione sarà vera solo se P e Q sono veri, allora se P è falsa, l'istruzione Q non viene valutata . Fondamentalmente i computer sono pigri (efficienti) e non si preoccupano di valutare Q se non ne hanno. Questo vale anche per OR logico, vedere il link precedente.

I tre contesti di && in Bash:

1) Utilizzo della valutazione di cortocircuito con lo stato di uscita di un comando:
ogni comando ha uno stato di uscita. Se un comando ha un errore, ha uno stato di uscita diverso da zero. Pertanto, se lo stato di uscita è diverso da zero e && viene utilizzato per concatenare i comandi in un'istruzione, i comandi successivi non verranno valutati (eseguiti) se quello precedente non aveva uno stato di uscita pari a 0 (Vero). Ciò è dovuto alla valutazione del corto circuito. Quindi se hai:

P && Q

Q non verrà eseguito se P non era vero (se P esce con uno stato diverso da 0, non è vero). Proprio come:

./configure && make

make non verrà eseguito se configure ha avuto un errore, non era vero. Quindi, in sostanza, finisce per essere un modo di scrivere se poi l'istruzione:

if ./configure ; then
   make
fi

Tieni presente che nella maggior parte dei contesti 0 è falso, ma non quando si tratta di uno stato di uscita.

2) && Può essere usato nel comando di prova [[]] di Bash:

&& Può anche essere usato all'interno del comando test integrato in bash [[]] per combinare espressioni in modo simile a come combinare comandi. L'intera operazione di test sarà vera solo se entrambi gli operandi (lati) di && sono veri, ad esempio:

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

sarebbe un modo per dire se $ a è un numero intero compreso tra 2 e 5 (esclusi 2 e 5).

3) Valutazione aritmetica:

Infine, && può essere utilizzato nella valutazione aritmetica come AND logico. Se entrambi (AND logico) dei numeri seguenti sono diversi da zero, restituisce 0, altrimenti viene restituito 1:

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

@Kyle: && usato al di fuori di un'espressione logica è "l'operatore di controllo AND", comportamento simile ma tecnicamente diverso
drAlberT

Non seguire il tuo commento, cosa intendi al di fuori di un'espressione logica?
Kyle Brandt,

Voglio dire che in un'espressione l'operatore di controllo && assume la media di "logico e", altrimenti è solo un "e". È "l'operatore di controllo AND", utilizzato nelle liste. gli operatori logici sono usati nel contesto dell'espansione aritmetica, all'interno delle espressioni.
drAlberT,

nel if [./configure]esempio, è necessario rimuovere le staffe. Il corretto èif ./configure; then make...
Juliano,

Juliano, Buona cattura, si aggiornerà. AlberT, c'è qualche differenza oltre ai termini che le pagine man le danno?
Kyle Brandt,

3

Penso che farai meglio con una spiegazione del significato "reale", le implicazioni sono un'altra cosa :)

  • && è l'operatore di controllo "AND". Da bash man :
    Gli operatori di controllo && e || denotano rispettivamente elenchi AND e elenchi OR.
    Un elenco AND ha il modulo  
        comando1 && comando2     
    command2 viene eseguito se, e solo se, command1 restituisce uno stato di uscita pari a zero.
    [..tagliare..]
    Lo stato di ritorno degli elenchi AND e OR è lo stato di uscita dell'ultimo comando
    eseguito nell'elenco.
    
    Un operatore di controllo è
    Un token che esegue una funzione di controllo. È uno dei seguenti simboli:
        || & &&; ;; () |
    
  • \è il " carattere di escape ", ed è uno dei tre meccanismi di quotazione disponibili in bash:
    PREVENTIVAZIONE
       Le virgolette vengono utilizzate per rimuovere il significato speciale di determinati caratteri o parole dalla shell.
    [..tagliare..]
       Esistono tre meccanismi di quotazione: il carattere di escape, virgolette singole e virgolette doppie.
       Una barra rovesciata non quotata (\) è il carattere di escape. Conserva il valore letterale del personaggio successivo che segue, ad eccezione di. Se viene visualizzata una coppia \ e la barra rovesciata non viene quotata, la \ viene trattata come una continuazione di riga (ovvero viene rimossa dal flusso di input e effettivamente ignorata).
    [..tagliare..]
    La barra rovesciata conserva il suo significato speciale solo quando è seguita da uno dei seguenti caratteri: $, `,", \ o.
    
    Ciò significa che se metti un carattere di escape (il "\") alla fine di una riga stai di fatto sfuggendo al nuovo carattere di linea che lo segue immediatamente (il carattere di RITORNO) e quindi l'effetto di "continua la linea" altri hanno già spiegato nella loro risposta
  • Il trattino " - " che alcuni comandi accettano come parametro è una convenzione, non un carattere o un operatore speciale della shell. Come altri hanno già sottolineato, si tratta di una sorta di segnaposto per i flussi I / O standard. A seconda del programma a cui ci riferiamo, potrebbe rimanere per stdin (input standard) o stdout (output standard).

I miei 2 centesimi


1
Probabilmente sarà un caso di tl; dr. Incollare pezzi giganteschi di una manpage - per quanto illuminante com'è - probabilmente intimidirà l'OP.
rodjek,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.