: True arasındaki fark nedir?


15

İçinde bash:

$ type :
: is a shell builtin
$ type true
true is a shell builtin

Aynı oldukları anlaşılıyor, ancak aynı sistem izini vermiyorlar:

$ strace :
strace: :: command not found
$ strace true
execve("/bin/true", ["true"], [/* 82 vars */]) = 0
[snip]
exit_group(0)                           = ?

Fark etmeyi denedim strace bash -c : 2>:.txtve strace bash -c true 2>true.txtaralarında bellek konumları dışında herhangi bir fark bulamadım.

İçinde dash:

$ type :
: is a special shell builtin
$ type true
true is a shell builtin

Tamam, bu yüzden aynı değiller. help :ve help trueçok kullanışlı değiller ve aynı şeyi bashve içinde döndürürler dash. :Üç bayt kaydetmesi ve komut dosyalarını daha az okunabilir hale getirmesi dışında, aralarında herhangi bir pratik fark var mı ?


Yanıtlar:


27

Davranışta gerçek bir fark yok. Her iki komut da hiçbir şey yapmaz ve başarılı bir durumla çıkar. :hiçbir şey yapmamaya vurgu yapar; truebaşarılı durumu vurgular.

strace trueçünkü truehem kabuk yerleşik hem de harici komut ( /bin/true); :sadece bir kabuk yerleşiktir (hayır /bin/:- olsa da olabilir ve muhtemelen çok eski Unix sistemlerinde vardı). Bash'da deneyin

type -a :
type -a true

Her ikisinin de var olma nedenleri tarihseldir. Doğru hatırlıyorsam, bazı çok erken kabuklarda yorum sözdizimi yoktu :, bunun yerine do-nothing komutu kullanıldı.

İçinde bazı iç farklar var dash. Git: //git.kernel.org/pub/scm/utils/dash/dash.git adresinde bulunan kaynağa baktığımızda bazı farklı kod yolları gösteriyor eval.c, ancak diğerlerinden gözle görülür farklı davranışlar üretemedim. specialçıkışındaki kelimeden daha fazla type :.


8
Ayrıca, UNIX'in ilk sürümlerinde /bin/trueveya yoktu /bin/false. Ayrıca :komut bazen argümanı işleme yan etkileri için kullanılır: : ${num_times:=10}.
Arcege

5
:oldu aslında bir etiket göstergesi vardı Bourne kabuğunun atalarından geri goto. Görünüşe göre :bir yorum göstergesi olarak kötüye ve sıkışmış.
Gilles 'SO- kötü olmayı bırak

1
:Goto için bir etiket göstergesi olarak davranışı, Microsoft'un sözde Unix komut satırı klonunda korunur command.comve satır yorumunu cmd.exekötüye kullanma pratiği gibi halefinde kalır ::.
Sorpigal

8

Bash'te aynılar. Bak builtins/colon.defBash-4.2 kaynak kodunda.

Komutunuzda strace trueaslında /bin/truebash yerleşik true yerine binary çalıştırıyorsunuz .

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.