qual è la differenza tra "command && command" e "command; comando"


48

Vedo questi due usi su Ubuntu "command & amp; command and" e "command; command",
per esempio. apt-get update && apt-get upgrade

Cosa differirebbe se io usassi apt-get update; apt-get upgrade?
Non sto chiedendo questo specifico utilizzo, ma in generale qual è la differenza tra questi due usi?


2
La riga di comando e il batch di Win hanno la stessa funzionalità: & (simple sequencing), && (conditional AND) and || (conditional OR).
Karan

5
Guarda anche: Bash Reference Manual - Elenco dei comandi . In generale, non c'è nulla che non sia possibile trovare nella documentazione; vale davvero la pena esaminare se hai una domanda su specifici elementi di sintassi.
slhck

1
@Karan E per completezza, bash (linux / Ubuntu) ha || anche.
Izkata

Risposte:


86

&& è un operatore logico. ; è un semplice sequenziamento.

Nel cmd1 && cmd2, cmd2 verrà eseguito solo se cmd1 viene chiuso con un codice di ritorno corretto.

Considerando che cmd1; cmd2, cmd2 verrà eseguito indipendentemente dallo stato di uscita di cmd1 (supponendo che tu non abbia impostato la shell per uscire da tutti gli errori nel tuo script o qualcosa del genere).

Su una nota correlata, con cmd1 || cmd2, usando il || Operatore logico 'OR', cmd2 verrà eseguito solo se cmd1 non riesce (restituisce un codice di uscita diverso da zero).

Questi operatori logici vengono talvolta utilizzati negli script al posto di un'istruzione di base if. Per esempio,

if [[ -f "$foo" ]]; then mv "$foo" "${foo%.txt}.mkd"; fi

... può essere raggiunto più concisamente con:

[[ -f "$foo" ]] && mv "$foo" "${foo%.txt}.mkd"

Lo trovo un po 'fallace perché, dal mio punto di vista, il codice di ritorno di successo significa 0, che, quando viene lanciato in bool, fornisce un falso logico. Quindi, seguendo la filosofia della valutazione di Mccarthy usata nella maggior parte dei linguaggi, dovrebbe restituire immediatamente false invece di valutare (eseguire) la prossima affermazione.
Della

33

Sintassi

command1 && command2

comando2 viene eseguito se, e solo se, command1 restituisce uno stato di uscita pari a zero ( vero ). In altre parole, corri command1 e se ha successo, allora corri command2.

command1 ; command2

Tutti e due command1 e comando2 sarà eseguito indipendentemente Il punto e virgola consente di digitare molti comandi su una riga.

Relazionato :

command1 || command2

comando2 viene eseguito se, e solo se, command1 restituisce uno stato di uscita diverso da zero. In altre parole, corri command1 con successo o eseguito command2.


Esempio

&& operatore:

$ rm /tmp/filename && echo "File deleted"

; operatore:

$ echo "foo" ; echo "bar"

|| operatore:

$ cat /tmp/filename 2>/dev/null || echo "Failed to open file"

Link esterno

  1. Linuxtopia.org
  2. Tldp.org
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.