Dalam bash
:
$ type :
: is a shell builtin
$ type true
true is a shell builtin
Sepertinya mereka sama, tetapi mereka tidak memberikan jejak sistem yang sama:
$ strace :
strace: :: command not found
$ strace true
execve("/bin/true", ["true"], [/* 82 vars */]) = 0
[snip]
exit_group(0) = ?
Saya mencoba diffing strace bash -c : 2>:.txt
dan strace bash -c true 2>true.txt
, tetapi tidak dapat menemukan perbedaan di antara mereka kecuali untuk lokasi memori.
Dalam dash
:
$ type :
: is a special shell builtin
$ type true
true is a shell builtin
OK, jadi mereka tidak sama. help :
dan help true
tidak terlalu berguna, dan mereka mengembalikan sama bash
dan dash
. Apakah ada perbedaan praktis sama sekali di antara mereka, kecuali yang :
menghemat tiga byte dan membuat skrip kurang dibaca?
Jawaban:
Tidak ada perbedaan nyata dalam perilaku. Kedua perintah tidak melakukan apa pun dan keluar dengan status yang berhasil.
:
menekankan tidak melakukan apa-apa;true
menekankan status sukses.strace true
berfungsi karenatrue
keduanya adalah builtin shell dan perintah eksternal (/bin/true
);:
hanya shell builtin (tidak ada/bin/:
- meskipun mungkin ada, dan mungkin pada sistem Unix yang sangat tua). Dalam bash, cobaAlasan keduanya ada adalah historis. Jika saya ingat dengan benar, beberapa shell yang sangat awal tidak memiliki sintaks komentar, jadi perintah do-nothing
:
digunakan sebagai gantinya.Ada beberapa perbedaan internal di
dash
. Melihat melalui sumbernya, tersedia di git: //git.kernel.org/pub/scm/utils/dash/dash.git, menunjukkan beberapa jalur kode yang berbeda di dalamnyaeval.c
, tetapi saya belum dapat menghasilkan perilaku yang tampak berbeda selain dari kataspecial
dalam output daritype :
.sumber
/bin/true
atau/bin/false
. Juga:
perintah kadang-kadang digunakan untuk efek samping pengolahan argumen:: ${num_times:=10}
.:
adalah awalnya indikator label , kembali nenek moyang dari Bourne shell yang memilikigoto
. Ternyata:
disalahgunakan sebagai indikator komentar dan macet.:
sebagai indikator label untuk goto dipertahankan dalam klon baris perintah semu-Unix Microsoftcommand.com
,, dan tetap dalam penggantinyacmd.exe
, seperti halnya praktik penyalahgunaan::
untuk komentar baris.Mereka identik di Bash. Lihat di
builtins/colon.def
kode sumber Bash-4.2.Dalam perintah
strace true
Anda, Anda sebenarnya menjalankan biner/bin/true
bukan bash built-in true.sumber