Bir bash betiğinde daha deyimsel olan: `|| true veya || : `?


36

Çok fazla kabuk betik yapmıyorum, bu yüzden belgelerigit submodule okurken biraz şaşırmıştım ve bu belgede kullandıkları sözdizimini gördüm:

Herhangi bir alt modüldeki komuttan sıfır olmayan bir dönüş işlemin bitmesine neden olur. Bu || :komutun sonuna ekleyerek geçersiz kılınabilir .

|| :Başarıyla çıkmak için bir komutu zorlamak için bir stenoya bakmak zorundaydım . Başarılı bir şekilde komut çıkışı yapmak zorunda kaldığımda kullandım || true. || :Daha deyimsel olarak mı kabul edilir?


Bash'ta ||:( boşluksuz ) da geçerli olduğuna dikkat etmek önemlidir. || :Veya ile aynı şeyi yapar || true.
Bruno Bronosky,

Yanıtlar:


38

trueBourne kabuğuna yerleştirilmemiştir. :her zaman öyleydi (daha önce #tanıtılmadan yorum yazmanın yoluydu ).

Bu, ve yazmanın daha kısa olması nedeniyle insanların tercih :edilmesinin en büyük nedeni muhtemelen true.

(POSIX kabukları başka farka dikkat edin bashsadece POSIX modunda): iken truedüzenli yerleşik (hatta yerleşik olmak zorunda değildir) 'dir, :bir olan özel yerleşik. Bunun, birçoğunun bu özel durumda herhangi bir etkisinin olması muhtemel olmayan birkaç sonucu vardır:

  • :Başarısız bir yeniden yönlendirme de dahil olmak üzere bir komut başarısız olursa, kabuğun çıkmasına neden olur. Uygulamada, yönlendirmeleri iletmediğiniz sürece bu muhtemelen bir fark yaratmaz.:

    $ sh -c ': > /   ; echo HERE'
    sh: 1: cannot create /: Is a directory
    $ sh -c 'true > /; echo HERE'
    sh: 1: cannot create /: Is a directory
    HERE
  • içinde var=value :, varhiç set kalır valuesonra :değil durumunda, getiriler true:

    $ var=1; var=2 :   ; echo "$var"
    2
    $ var=1; var=2 true; echo "$var"
    1

Ayrıca unutmayınız || truekabuklarında eserlerini rcve cshaileleri değil || :(ama iptal etmek değil set -ede csh).

|| :aynı değil :. Başka türlü ifade veya çalıştırma: (önceki boru hattının başarısız olması durumunda).

set -e
false

Çünkü çıkışına kabuğunu cikartırmı set -eve falsesıfır olmayan (başarısızlık) çıkış durumu vardır. set -eEtki iptal edilirse döner sıfırdan farklı çıkış durumu olarak kullanıldığını komut durumda olduğu gibi:

if false; then ...
while false; do ...
false && : ...
false || : ...

false && :sadece iptal eder set -e. false || :iptal eder set -eve çıkış durumunu ayarlar, 0böylece komutun başarısızlık çıkış kodunu yok saymak istediğimizi söylemek daha salak olur. Çoğu, bunun || truedaha okunaklı olduğunu savunuyordu (niyeti daha net ifade ediyor).


5
&& :parlak, herhangi bir doktor var mı veya bunun hakkında daha fazla okuma var mı? Google, bu tür anahtar kelimeleri bulmaya çalışırken
üzerimde yetersiz kalıyor

5

Genellikle, bash, kolon :ve trueeşittir.

İş || : daha aptalca kabul edilir?

Bence içeriğe dayanıyor .

Eğer bir istiyorsanız return valueveya conditionher zaman doğrudur, kullanmak gerektiğini truedaha net bir şekilde kodunuzu yapmak ve izleyiciler size değer vurgulamak istediğiniz olduğunu bildiririz var, anahtar kelime doğruysa , yani:

while true; do something

veya

<commnad>
RETURN_VALUE= $? || true

Ve hiçbir şey yapmak istemiyorsanız veya NOPkabuğunuzda, iki nokta üst üste kullanmalısınız.:

if condition
then
    : # DO NOTHING HERE
else
    do something
fi 

veya

while conditon
do
    : # DO NOTHING HERE
done

5

Bu yanıtların çoğu, en yaygın kullanımına cevap verememektedir :.

İlk olarak, bu tartışma bir Bourne kabuğu ( sh) türevi olmayan herhangi bir kabukla ilgili değildir . Hepsi Bourne türev kabuklar bkz söyledi trueve :aynı şey olarak. Programcılar :yerine kullanmak için teşvik edilirlerdi true, çünkü :her zaman yerleşik trueolmayan durumlar olduğu zaman her zaman bir yerleşikti.

:iki kullanım alanı vardır. Eş anlamlı değil #ama farklı bir işlevi var. Komut dosyanızın a altında ayıklanması sırasında , kullanılan set -xsatırlar #ayrıştırıcı tarafından düşürülür ve tamamen yoksayılır, oysaki satırlar :ayrıştırılır ve değerlendirilir. Bu hata ayıklamada gerçekten kullanışlıdır, çünkü -xbu satırlar altında gösterilir ve değerlendirmeden sonra değerleri gösterilir. Kodunuza printyalnızca -xkipte gösterilen ifadeleri koymak gibidir . :Gerçek kod olduklarından sonraki değerlere dikkat edin ve yan etkiler programınızı etkileyebilir.


1
İkinci kullanım nedir?
Peter Mortensen,
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.