C'è una differenza tra il modo in cui due e commerciali e un punto e virgola operano in bash?


71

Se volessi eseguire due comandi separati su una riga, potrei farlo:

cd /home; ls -al

o questo:

cd /home && ls -al

E ottengo gli stessi risultati. Tuttavia, cosa sta succedendo in background con questi due metodi? Qual è la differenza funzionale tra loro?

Risposte:


88

Il ;separa semplicemente un comando da un altro. Say &&dice di eseguire il seguente comando solo se il precedente ha avuto esito positivo

cd /home; ls -al

Questo cd /homee anche se il cdcomando fallisce ( /homenon esiste, non hai il permesso di attraversarlo, ecc.), Verrà eseguito ls -al.

cd /home && ls -al

Questo funzionerà solo ls -alse ha cd /homeavuto successo.


2
l'uso di ; è davvero pericoloso (almeno con il comando rm), per esempio cd /some/dir; rm -fr ./*. Quindi con tale operazione distruttiva devi essere sicuro di essere nel posto giusto prima di eseguire rm. Il comando giusto ècd /some/dir && rm -fr ./*
ALex_hha,

70
a && b

se a restituisce zero codice di uscita, viene eseguito b .

a || b

se a restituisce un codice di uscita diverso da zero, viene eseguito b .

a ; b

a viene eseguito e quindi b viene eseguito.


16
cd /fakedir; ls -al

Viene eseguito lsnella directory corrente perché cd /fakedirnon funzionerà e la shell ignorerà lo stato di uscita diverso da zero.

cd /fakedir && ls -al

Poiché l' &&operatore continuerà solo se il comando precedente è uscito normalmente (stato zero), non lsverrà eseguita alcuna operazione.

Vi sono altri operatori, come ad esempio &un processo in background. Spesso posto alla fine di un comando, può essere messo nel mezzo di una catena.


4

Puoi anche unirli insieme come una if..then..elselogica di comando per il concatenamento.

esempio:

ls file.ext && echo "file exists" || echo "file does not exist"
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.