Kolon yerleşiminin amacı nedir?


44

Birçok kabuk senaryosunu kırdım ve bazen en basit şeyler beni şaşırtmaya başladı. Bugün :(colon) bash yerleşimini kapsamlı olarak kullanan bir senaryo ile karşılaştım .

Dokümantasyonunda basit yeterince görünüyor:

: (a colon)  
     : [arguments]  

Argümanları genişletmenin ve yönlendirmeleri gerçekleştirmenin ötesinde hiçbir şey yapmayın. Dönüş durumu sıfır.

Ancak bunu daha önce sadece kabuk genişlemesinin gösterilerinde kullanıldığını gördüm. Karşılaştığım senaryoda kullanım durumu bu yapıyı geniş ölçüde kullandı:

if [ -f ${file} ]; then
    grep some_string ${file} >> otherfile || :
    grep other_string ${file} >> otherfile || :
fi

Aslında yüzlerce ahmak vardı, ama onlar sadece aynıydı. Yukarıdaki basit yapı dışında hiçbir girdi / çıktı yönlendirmesi mevcut değil. Kodda daha sonra bir dönüş değeri kontrol edilmez.

Bunu "ya da hiçbir şey yapma" yazan işe yaramaz bir yapı olarak okuyorum. Bu hileleri "veya hiçbir şey yapmama" ile bitirmek hangi amaca hizmet edebilir? Hangi durumda bu yapı || :, tüm örneklerden uzaklaşmaktan farklı bir sonuca neden olur ?


10
Görebildiğim bir amaç, :alternatif olarak kullanmak true. Belki errexitde ayarlanmıştır ve yazar bazı komutların çıkış durumuyla ilgilenmez.
jw013


Stackoverflow bağlantılı sayfa IMO biraz daha kapsamlı (bu sayfayı ve bağlantılı sayfayı okumak çok güzel).
Trevor Boyd Smith

Yanıtlar:


29

Görünen :komut dosyanızda ler yerine kullanılmaktadır true. Eğer grepdosyada bir eşleşme bulamazsa, sıfırdan farklı bir çıkış kodu döndürür; jw013 yorumunda da belirtildiği gibi, eğer errexitayarlanmışsa, muhtemelen -eshebang satırına göre, herhangi grepbir eşleşme bulamazsa , komut dosyası çıkar . Açıkçası, yazar, böylece (s) istenmediğini ne olduğunu ifade etti || :(benim durumumda) daha ortak gibi, söz konusu bileşik komutunun her zaman sıfır çıkış durumu yapmak || true/ || /bin/true.


Duh. Bu bir RPM derleme betiği konseptindeydi ve betiğin içinde kontrol eden bir çıkış kodu görmedim, ancak üst sürecin izleyebileceğini düşünmeyi unuttum.
Caleb,

8
Eğer durum buysa, kötü kodlama uygulaması derdim. Bunun trueyerine işlevsel olarak eşdeğerdir , ancak anlamsal niyet ile daha açıktır true. :açık bir NOP istendiğinde daha uygundur.
jw013

Deneyimlerime göre, bu RPM komut dosyalarında yaygın bir uygulamadır. Muhtemelen olmamalıydı, ama biz varız.
mattdm

bazı titiz tercih :yerine trueçünkü :bir bashyerleşik olarak nerede truegenellikle daha çabayla derlenmiş ikili olduğunu. genellikle truekodu daha okunabilir olduğundan kullanıyorum (aynı şekilde sourceonun yerine kullanmayı tercih ediyorum .).
Trevor Boyd Smith

36

:Builtin da genişleme sık sık yan etki yalnızca kullanılan ve genişletilmiş değer atılır Bash "atama varsayılan değerler" kabuk genişleme ile yararlıdır:

# assign FOO=bar iff FOO is unset
: ${FOO:=bar}

2
Buraya bakmak için buraya geldim, bu modeli bir senaryoda varsayılan değerleri bildirmek için gördüğümde şaşkınlığa uğradı.
ffledgling

20

:Geçmişte kullandığım iki yeri düşünebilirim .

while :
do
     shell commands
     some exit condition
done

Bu sonsuza dek döngüdür.

function doSomethingStub {
    :
}

Kontrolün üst seviyedeki akışının doğru olması için saplama fonksiyonuna geçin.

Eski Günlerde gördüğüm tek kullanımlık: #!/bin/sh(veya her neyse) bir çizgi yerine, bir çizgi göreceksiniz :. Eski Real Unix çekirdeklerinden veya Real Unix mermilerinden bazıları "Ben bir kabuk betiğiyim, beni çalıştırdım" anlamına gelirdi. Hatırladığım kadarıyla, bu sadece csh'ın ortak bir etkileşimli kabuk olarak kullanılmasına neden oldu.


@BruceEdiger: "Shecolon" hattına bir referansınız var mı?
l0b0

7
Sonunda bir ": bir betiğin başında" referansı ve açıklaması bulundu: faqs.org/faqs/unix-faq/faq/part3/section-16.html
Bruce Ediger 20

1
başlangıçtaki davranış :çok garip. Gerçekten komut dosyasının çalıştırılmasına neden olduğunu buldum sh. nerede bir shebang olmadan komut dosyası başlattığınızda ... o (Çalıştırdığınız öyleyse çalışan ne olursa olsun kabuk ile komut dosyasını çalıştırmak için çalışır gibi basho kadar çalıştırmak çalışırsa bashvarsa csho kadar çalıştırın dener sonra csh).
Trevor Boyd Smith


11

Eski bir referans çıkarmıştım: "UNIX Programlama Ortamı" (c) 1984, Kernighan ve Pike.

Sayfa 147 (Kabuk Programlama) şunu söylüyor:

":", argümanlarını değerlendirmekten ve "true" döndürmekten başka bir şey yapmayan bir kabuk yerleşik komutudur. [Script örneğine atıfta bulunmak yerine], yalnızca gerçek bir çıkış durumu döndüren true değerini kullanabilirdik . (Ayrıca yanlış bir komut var.) Ancak ':', dosya sisteminden bir komut çalıştırmadığından, gerçek değerden daha etkilidir . [Italics / vurgu benimdir.]


2
Tabii ki, trueşimdi birçok sistemde yerleşik bir kabuk.
üçlü

8

Kabuğun ilk sürümlerinde yorum sözdizimi bulunmadığını hatırlıyor gibiyim. :(Muhtemelen gerçek bir yürütülebilir dosya olurdu) ile başlayan bir çizgi /bin/trueen iyi alternatif olacaktır.

İşte antik Thompson kabuğu için bir sayfa (ilişki yok); Herhangi bir yorum sözdiziminden söz edilmez.


4
Kökeni :aslında gotobazı antik kabuklarda , komut için bir etiket göstergesiydi (hangisini bilmiyorum). : somethingEğer bir eşleşme olmasaydı, bir etiket gerçekten bir yorum olarak kullanılabilir goto. Uygulama gotokaybolduktan sonra bile takılıp kaldı .
Gilles 'SO- kötülükten vazgeç'

8

":" hata ayıklama için kullanışlıdır.

DEBUGLOG=": debugfunction"

statement
statement
$DEBUGLOG arg1 arg2 ...
statement
statement

Normalde çalışan hata ayıklama işlemi hiçbir zaman çalıştırılmaz, bu nedenle noop üzerinde sadece adımlar uygulanır (değişkenler ve joker karakterler olsa da genişletilir). Daha fazla hata ayıklama gerekliyse, noop'u değişkenden kaldırın ve ne olursa olsun argümanlarla hata ayıklama çağrılır.

Bir başka kullanışlı kullanım, kabuk sözdiziminde eksik olan bir özellik olan blok yorumdur.

: << COMMENT
all --statements --in --here
are now -a here document which are
passed to --the noop
COMMENT
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.