Czy jest jakaś różnica między tym, jak dwa ampersands i średnik działają w trybie bash?

71

Gdybym chciał uruchomić dwa osobne polecenia w jednym wierszu, mógłbym to zrobić:

cd /home; ls -al

albo to:

cd /home && ls -al

I otrzymuję te same wyniki. Co jednak dzieje się w tle z tymi dwiema metodami? Jaka jest funkcjonalna różnica między nimi?

Sean P.
źródło

Odpowiedzi:

88

Po ;prostu oddziela jedno polecenie od drugiego. &&Mówi tylko uruchomić następujące polecenie, jeśli poprzedni był udany

cd /home; ls -al

Spowoduje to, cd /homea nawet jeśli cdpolecenie się nie powiedzie ( /homenie istnieje, nie masz uprawnień do przejścia, itp.), Uruchomi się ls -al.

cd /home && ls -al

To uruchomi się tylko, ls -aljeśli cd /homezakończyło się powodzeniem.

użytkownik9517
źródło
2
użycie na przykład ; jest naprawdę niebezpieczne (przynajmniej z poleceniem rm) cd /some/dir; rm -fr ./*. Tak więc przy tak niszczycielskim działaniu musisz mieć pewność, że jesteś we właściwym miejscu przed uruchomieniem rm. Prawidłowe polecenie tocd /some/dir && rm -fr ./*
ALex_hha 18.04.16
70
a && b

jeśli a zwraca zerowy kod wyjścia, to b jest wykonywane.

a || b

jeśli a zwraca niezerowy kod wyjścia, to b jest wykonywane.

a ; b

a jest wykonywane, a następnie b jest wykonywane.

Minsuk Song
źródło
16
cd /fakedir; ls -al

Działa lsw bieżącym katalogu, ponieważ cd /fakedirzawiedzie, a powłoka zignoruje status wyjścia, który nie jest równy zero.

cd /fakedir && ls -al

Ponieważ &&operator będzie kontynuował działanie tylko wtedy, gdy poprzednie polecenie zakończyło się normalnie (stan zero), żadna lsoperacja nie zostanie wykonana.

Istnieją inne operatory, takie jak te, &które będą stanowić tło procesu. Choć często umieszczany na końcu polecenia, może być umieszczony w środku łańcucha.

Jeff Ferland
źródło
4

Możesz także łączyć je ze sobą jak if..then..elsew logice poleceń do łączenia łańcuchów.

przykład:

ls file.ext && echo "file exists" || echo "file does not exist"
Mtl Dev
źródło