Bash / sh - && ve;


136

Normalde ;bir satırda birden fazla komutu birleştirmek için kullanıyorum , ancak bazı insanlar tercih ediyor &&. Fark var mı? Örneğin, cd ~; cd -ve cd ~ && cd -aynı şeyi yapmak gibi görünüyor. Hangi sürüm daha taşınabilir, örneğin Android'in kabuğu gibi bir bash-alt kümesi tarafından desteklenecek mi?

Yanıtlar:


193

Önceki komut başarısız ;olursa ikincisi çalıştırılır.

Ama &&ikincisi koşmayacak.

Bu, işlemler arasındaki "tembel" mantıksal "VE" işlenenidir.


2
Başka bir deyişle, kısa devre davranışı var
peterchaula

@peter Hangisi? ;Bir veya &&bir? Yoksa ikisini de mi kastediyorsun?
Shayan

@Shayan &&,.
peterchaula

57

Ben &&uzun zaman önce yakındaki bilgisayarda kullanıyorum:

root# pwd
/
root# cd /tnp/test; rm -rf *
cd: /tnp/test: No such file or directory
...
... and after a while ...
...   
^C

ama yardım etmedi ...;)

cd /tnp/test && rm -rf * güvenlidir... ;)


26
Daha güvenli olmak için, ben kullanırımrm -rf /tnp/test
melvynkim

5
Daha güvenli olmak için, rm /tnp/test/ -rfölümcül bir şekilde girip girmemek için kullanmak daha iyidir
radrow

22

In cmd1 && cmd2, cmd2yalnızca cmd1başarılı olursa (0 döndürür) yürütülür .

In cmd1 ; cmd2, cmd2her durumda yürütülür.

Her iki yapı da POSIX uyumlu bir kabuğun parçasıdır.


11

&&önceki durum 0'dan çıkmışsa bir sonraki komutu yürütmek anlamına gelir. Bunun tersi için, ||önceki komut 0'a eşit olmayan bir durumdan çıkarsa yani yani her zaman yürütülür ;.

Önceki komutun tamamlanıp tamamlanmadığına bağlı olarak belirli bir işlem yapmanız gerektiğinde çok yararlıdır.


5

İle ayrı komutlar ;, tamamlanma durumlarına bakılmaksızın sırayla yürütülür.

İle &&, ikinci komut yalnızca ilkinin başarıyla tamamlanması durumunda yürütülür (0 çıkış durumunu döndürür).

Bu, altındaki bash man sayfasında ele alınmıştır Lists. Unix benzeri bir kabuğun bu operatörlerin her ikisini de desteklemesini beklerdim, ancak Android kabuğunu özellikle bilmiyorum.


2
İşte bash el kitabına bir bağlantı: gnu.org/software/bash/manual/bashref.html#Lists
glenn jackman

3

&&;her zaman ikinci komut yürütülürken koşullu yürütmeye izin verir .

Örneğin command1 && command2, command2yalnızca command1sona erdirildiğinde yürütülür exit 0, sinyaller her şey yolunda giderken command1 ; command2, ikinci komutta sonuç ne olursa olsun her zaman yürütülür command1.


1

&& mantıklı VE bash. Bash, mantıksal AND'in kısa devre değerlendirmesine sahiptir. Bu deyim aşağıdakileri ifade etmenin daha basit bir yoludur:


cmd1;rc=$?
if [ $rc -eq 0 ]; then
   cmd2
fi

Oysa; sürüm sadece:


cmd1
cmd2
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.