Linux Bash Sözdizimi: &&, \ ve -


14

Bash komutlarının sonunda ' &&', ' \' ve ' -' ne anlama geliyor?

Özellikle, Ubuntu'nun yetenek paketi yöneticisine ortak anahtarlar eklemesi gereken aşağıdaki satır kombinasyonuyla karşılaştım, bu karakterler burada ne için kullanılıyor?

    gpg - keyserver keyserver.ubuntu.com --recv 26C2E075 && \
    gpg - ihracat --armor 26C2E075 | sudo apt-key add - && \
    sudo uygun-güncelleme

"/", "\" ile aynı değildir
Thomas

Thomas: Görevini düzeltti
Kyle Brandt

Buradaki ters eğik çizgilere gerek yoktur, çünkü && da satır devamını ima etmek için yeterli olacaktır. Ancak ters eğik çizgiyi kullanmak okunabilirliğe yardımcı olur.
sonraki duyuruya kadar duraklatıldı.

Yanıtlar:


37

"&&" komutları birlikte zincirlemek için kullanılır, böylece bir sonraki komut sadece ve sadece önceki komut hatasız olarak çıkarsa (veya daha doğrusu 0 dönüş koduyla çıkarsa) çalıştırılır.

Bir satırın sonunda "\" , satırları bir araya getirmenin bir yoludur. Yani aşağıdaki iki satır:

gpg --keyserver keyserver.ubuntu.com --recv 26C2E075 && \
gpg --export --armor 26C2E075

satır tek satırla yazılmış gibi işlenir:

gpg --keyserver keyserver.ubuntu.com --recv 26C2E075 && gpg --export --armor 26C2E075

"-" , belirli bir bash işlevi olmayan bir komut satırı bağımsız değişkenidir. Tam olarak nasıl ele alınacağı, çalıştırılan komuta bağlıdır (bu durumda apt-key ). Bağlama bağlı olarak, genellikle " bir dosyadan ziyade stdin'den veri okuma " veya " satırın geri kalanını komut satırı argümanları yerine veri olarak işlemek " olarak belirtilir.


5
Bu durumda, '-' sudo'nun bir parametresi değil, 'apt-key' parametresidir, yani bir anahtar dosyası yerine 'apt-key', kanaldan ('|') kendi stdinine gelen verileri kullanıyor demektir. bir anahtar olarak. "Gpg --export" seçeneği, "--out a_file_name.key" girmeden, gpg stdout'undan yeni bir anahtarı, borudan ('|') 'apt-key' stdinine itin Kolay: - )
edomaur

2
hoppala. yarı uyurken soruları cevaplamak için aldım. sabit.
goldPseudo

7
&& == if the first command succeeded, run the next one
\ == the next line is part of the first line, not two seperate lines
- == read the input from stdin (console)

6

&& mantıksal AND mi:
&&, Mantıksal AND'i ifade etmenin bir yoludur , yani tüm ifadenin yalnızca her iki tarafı da doğruysa Doğru olduğu anlamına gelir. Mantıkta, tüm ifadenin (P&Q) sadece hem P hem de Q doğru olduğunda doğru olduğu söylenir .

Bunun bir sonucu olarak, bilgisayarlar genellikle P&Q'yu kısa devre değerlendirmesi olarak görürler . Dolayısıyla, tüm ifade yalnızca Hem P hem de Q doğruysa Doğru olacağından, P yanlışsa, Q ifadesi değerlendirilmez . Temelde bilgisayarlar tembeldir (verimli) ve eğer yoksa Q'yu değerlendirmeyi zahmet etmeyin. Bu mantıksal VEYA için de geçerlidir, önceki bağlantıya bakın.

Bash & & in Üç Bağlamı:

1) Komutun çıkış durumuyla Kısa Devre Değerlendirmesini kullanma:
Her komutun bir çıkış durumu vardır. Bir komutta hata varsa, sıfır olmayan bir çıkış durumu vardır. Bu nedenle, çıkış durumu sıfırdan farklıysa ve && komutları bir ifadeye zincirlemek için kullanılırsa, daha önceki komutların çıkış durumu 0 (Doğru) değilse daha sonraki komutlar değerlendirilmez (yürütülmez). Bunun nedeni kısa devre değerlendirmesidir. Eğer varsa:

P && Q

P doğru değilse Q yürütülmez (P 0 dışında bir durumla çıkarsa, bu doğru değildir). Aynı:

./configure && make

configure komutu bir hata içeriyorsa, make yapılamaz. Yani, temelde, eğer if ifadesi yazmanın bir yolu olur:

if ./configure ; then
   make
fi

Unutmayın, çoğu bağlamda 0 yanlıştır, ancak bir çıkış durumu söz konusu olduğunda değil.

2) && Bash'in yerleşik [[]] test komutunda kullanılabilir:

&& Ayrıca ifadeleri birleştirme komutlarıyla aynı şekilde birleştirmek için bash [[]] içindeki yerleşik test komutunun içinde de kullanılabilir. Tüm test işlemi yalnızca && 'nin her iki işleneni de (yanları) doğruysa doğru olacaktır, örneğin:

if [[ ( $a -gt 2 ) && ( $a -lt 5 ) ]]; then ... 

$ a'nın 2 ile 5 arasında bir tam sayı olup olmadığını (2 ve 5 dahil değil) söylemenin bir yolu olacaktır.

3) Aritmetik Değerlendirme:

Son olarak, && aritmetik değerlendirmede Mantıksal AND olarak kullanılabilir. Aşağıdakilerdeki sayıların her ikisi de (mantıksal AND) sıfır değilse , 0 döndürür, diğer 1 döndürülür:

kbrandt@desktop:~/$ echo $((1 & 1))
1
kbrandt@desktop:~/$ echo $((0 && 1))
0

@Kyle: && mantıksal bir ifadenin dışında kullanılan "VE kontrol operatörü", benzer davranış ama teknik olarak farklı
drAlberT

Yorumunuzu takip etmeyin, mantıklı bir ifade dışında ne demek istersiniz?
Kyle Brandt

Bir ifadede && kontrol operatörünün "mantıksal" ve "yalnızca" ve "anlamına geldiği anlamına gelir. Listelerde kullanılan "AND kontrol operatörü" dür. mantıksal işleçler ifadeler içindeki aritmetik genişleme bağlamında kullanılır.
drAlberT

içinde if [./configure]örneğin, parantez kaldırmalısınız. Doğruif ./configure; then make...
Juliano

Juliano, İyi yakalama, güncellenecek. AlberT, man sayfalarının verdiği terimler dışında bir fark var mı?
Kyle Brandt

3

Bence "gerçek" anlamının bir açıklaması ile daha iyi olacak, çıkarımlar başka bir şey :)

  • && "VE" kontrol operatörüdür. Gönderen bash adam :
    Kontrol operatörleri && ve || sırasıyla VE listelerini ve VEYA listelerini belirtin.
    AND listesi şu şekildedir:  
        komut1 && komut2     
    command2, yalnızca command1 sıfır çıkış durumunu döndürürse yürütülür.
    [..kesmek..]
    AND ve OR listelerinin dönüş durumu son komutun çıkış durumudur
    listede yürütülür.
    
    Bir kontrol operatörü olan
    Bir kontrol işlevi gerçekleştiren belirteç. Aşağıdaki sembollerden biridir:
        || & &&; ;; () |
    
  • \" kaçış karakteri " dir ve bash'ta bulunan üç alıntı mekanizmasından biridir:
    ALINTI YAPMAK
       Alıntılama, belirli karakterlerin veya kelimelerin özel anlamını kabuğa çıkarmak için kullanılır.
    [..kesmek..]
       Üç tırnak mekanizması vardır: kaçış karakteri, tek tırnak ve çift tırnak.
       Tırnak işareti olmayan bir ters eğik çizgi (\) çıkış karakteridir. Sonraki karakterin gerçek değerini, hariç, korur. Bir \ pair görünürse ve ters eğik çizginin kendisi alıntılanmazsa, \ bir satır devamı olarak kabul edilir (yani, giriş akışından kaldırılır ve etkin bir şekilde yoksayılır).
    [..kesmek..]
    Ters eğik çizgi, yalnızca şu karakterlerden birini izlediğinde özel anlamını korur: $, `,", \, veya.
    
    Bu, bir satırın sonuna bir kaçış karakteri ("\") koyarsanız, aslında hemen onu izleyen yeni satır karakterinden (RETURN karakter) kaçarsınız ve böylece "satır devam et" diğerleri zaten cevaplarında açıkladı
  • Bazı komutların parametre olarak kabul ettiği kısa çizgi char - - özel bir karakter veya işleç değil, bir kuraldır. Diğerlerinin de belirttiği gibi, standart G / Ç akışları için bir tür yer işaretleyicidir. Programa bağlı olarak, stdin (standart girdi) veya stdout (standart çıktı) için kalabilir.

2 sentim


1
Muhtemelen bir tl vakası olacak; dr. Bir man sayfasının dev parçalarını yapıştırmak - olduğu gibi aydınlanmak - muhtemelen OP'yi korkutur.
rodjek
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.