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?

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.


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.


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.


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"
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.