Hangisi daha iyidir: kullanma; veya && bir satırda birden fazla komut çalıştırmak için mi?


427

Derslerde ve nasıl yapılır sık ​​sık kombine komutları görüyorum. Örneğin,

sudo apt-get update && sudo apt-get install pyrenamer

Orada dört olası konnektörleri gibi görünüyor: &, &&, ||ve ;. & Bağlayıcı bana açık olmasına rağmen (arka plana bir işlem gönderir ve terminali uygun bırakır), &&ve arasındaki farkın ne olduğu açık değildir ;. ||Kaya'nın yorumuna kadar ben de bilmiyordum .

Aşağıdaki sorular iki bağlayıcı arasındaki farkla ilgilidir, ancak bunu yorumlarda çoğunlukla yapın:

Yani burada bir dizi ilgili soru var:

  1. Arasındaki fark nedir ;ve &&?
  2. Bunları sırasıyla ne zaman kullanmalısınız ? Bazı kullanım durumlarını görmek güzel olurdu: bir komut çalıştırmak ve sonra bilgisayarımı kapattıktan sonra hangi bağlayıcıyı seçmeliyim?
  3. Onların nelerdir avantajları ve tehlikeleri ? Robie Basak , bu cevabın yorumunda cd /somewhere_else; rm -Rf *, örneğin bir komut zincirindeki ilk elemanın başarısız olması gibi bir komutun yıkıcı sonuçlara yol açabileceğinden bahseder .
  4. Eğer uygunsa, nereden geliyorlar?

7
Karşılaşmadığınız başka bir bağlayıcı var: birincisi sıfır olmayan (başarısız) durumdan çıkmışsa, yalnızca ikinci komutu yerine getirmesi dışında ||aynıdır &&.
Kaya,

4
Ayrıca, komut dosyanızı çalıştırmanın set -e, komutların hepsinin bağlı olduğu gibi başarısız olması durumunda komut dosyasını durduracağını unutmayın &&.
choroba


3
Kimse Qn 4'e cevap vermedi ... && ve || C programlama dili tarafından ilham alındı. (X && y) durumunda, x, false olarak değerlendirilirse, tüm ifadenin false olması gerekir, böylece bir derleyici, pahalı olması durumunda, y'nin değerlendirmesini optimize edebilir. Modern C ve C ++ standartları aslında bu optimizasyonu gerektirir , böylece programlar x'in yanlış olması durumunda y'nin değerlendirilmeyeceğini güvence altına alabilirler. Örneğin, ptr null olsa bile (ptr && ptr-> days> 31) çökmez. Ayrıca C de ifadeler ile biter; Aynı satırda başka bir ifade olup olmadığına bakılmaksızın.
Kevin

Yanıtlar:


771

Kopya kağıdı:

A; B    # Run A and then B, regardless of success of A
A && B  # Run B if and only if A succeeded
A || B  # Run B if and only if A failed
A &     # Run A in background.

19
Ve elbette A & B &: Arkaplanda A'yı çalıştırın, ardından arkaplanda B'yi çalıştırın (başarıya bakmaksızın) ve kontrolü kabuğa geri döndürün. Bu genellikle aynı anda her iki işlemi de aynı şekilde yapar.
Sınırlı Kefaret

4
Söylemek mümkün mü: arka planda çalıştır, ardından arka planda sadece çalıştıysa? (Sanırım &&&?)
user230910

15
@ user230910: bu olurdu (A && B) &.
Aralık'ta

5
Bunun için yetkili belgeye başvurabilir misiniz?
Jaime Hablutzel

@Jack Cronjob'dan idam edildiğinde, bu kurala tam olarak uymuyor, neden bir fikrin var mı? Bir python dosyası için
CodeGuru

77

&&ikinci komutu yalnızca ilk 0 durumu ile çıkıldıysa (başarılı olursa) çalıştırır. ;ilki sıfır olmayan bir durumdan çıksa bile her iki komutu da çalıştırır.

Your örnek &&eşdeğer şekilde paraphrased edilebilir

if sudo apt-get update ; then
    sudo apt-get install pyrenamer
fi

Teşekkürler. Farklı sorguların kolayca ayırt edilebildiğinden emin olmak için soruyu güncelledim.
don.joey

5
@Gizli: ;İkinci komutun başarılı olması için bir öncekine gerek duymaması durumunda kullanmalısınız .
choroba

31

Kullanımı ;İlk komut başarılı olmamasından bağımsız olmadığını komutları çalıştırır.

&&2. komutu çalıştır komutunu kullanarak yalnızca ilk komut başarıyla çalıştırıldığında (durum 0).

Her ikisi de farklı bakış açıları üzerinde kullanılıyor. Daha uzun bir süreç için olduğu gibi, derlemeniz ve yüklemeniz gereken bir kurulum için söyleyin. yapmalısın make && make install. Bu nedenle, kurulum yalnızca makebaşarılı olursa çalışır .

Dolayısıyla bağımlı komutlar için kullanmanız gerekir &&

Sıkı basmak veya bağımsız komutları kullanmak ;

Yani bilgisayarı kapatmak istiyorsanız ilk iş bile başarısız oldu ;, ancak ilk işin tam başarısı istiyorsanız kapatma işlemini başlatın.&&


14

a ; ba'nın çıkış durumundan bağımsız olarak b'yi çalıştıracaktır. a && bb başarılı olursa b koşar.

Bu, ilk 3 soruya cevap vermek için gerekli ve yeterlidir. Özellikle, 2 çok geniş ve "bir" kesin cevap verilemiyor - en iyi bahis, duruma göre bir duruma karar vermek.

Dördüncü soruya gelince: Bunlar Bash sözdizimidir .

Her ikisini de kullanmanın kendine özgü bir tehlikesi yoktur. Yine, yukarıdaki tanım yeterlidir. Başarısız olursa, istenmeyen etkileri &&olduğunda yazacağınız anlamına gelir . Daha fazla kural veya açıklamaya gerek yoktur, IMHO.ba


1

A; B # A'nın ardından B'nin çalışması A'nın başarısından bağımsız olarak

A && B # B'yi çalıştırın ve eğer A başarılı olursa

A || B # B'yi çalıştırın, ve yalnızca A başarısız olursa

A & # Arka planda A çalıştırın.

Çok iyi bir kural. Bazı durumlarda, bu komutları bir alt kabukta kullanmak, onları tek bir birim olarak düşünmek istediğimizde veya bazı işlem çıktılarını mevcut kabukla birleştirmek istemediğimizde anlamlı olur.

Örnekler:

-conconaten iki komutun çıktısını:

(ls foo; ls bar) > single-result.txt

-senin bir dizine girip o anki komut satırını değiştirmeden oradan bir komut uygulayın:

(cd target-directory && jar -xf ../my-jar)
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.