Apa perbedaan antara: dan benar?

15

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>:.txtdan 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 truetidak terlalu berguna, dan mereka mengembalikan sama bashdan dash. Apakah ada perbedaan praktis sama sekali di antara mereka, kecuali yang :menghemat tiga byte dan membuat skrip kurang dibaca?

l0b0
sumber

Jawaban:

27

Tidak ada perbedaan nyata dalam perilaku. Kedua perintah tidak melakukan apa pun dan keluar dengan status yang berhasil. :menekankan tidak melakukan apa-apa; truemenekankan status sukses.

strace trueberfungsi karena truekeduanya 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, coba

type -a :
type -a true

Alasan 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 dalamnya eval.c, tetapi saya belum dapat menghasilkan perilaku yang tampak berbeda selain dari kata specialdalam output dari type :.

Keith Thompson
sumber
8
Selain itu, UNIX versi awal tidak memiliki /bin/trueatau /bin/false. Juga :perintah kadang-kadang digunakan untuk efek samping pengolahan argumen: : ${num_times:=10}.
Arcege
5
:adalah awalnya indikator label , kembali nenek moyang dari Bourne shell yang memiliki goto. Ternyata :disalahgunakan sebagai indikator komentar dan macet.
Gilles 'SO- stop being evil'
1
Perilaku :sebagai indikator label untuk goto dipertahankan dalam klon baris perintah semu-Unix Microsoft command.com,, dan tetap dalam penggantinya cmd.exe, seperti halnya praktik penyalahgunaan ::untuk komentar baris.
Sorpigal
8

Mereka identik di Bash. Lihat di builtins/colon.defkode sumber Bash-4.2.

Dalam perintah strace trueAnda, Anda sebenarnya menjalankan biner /bin/truebukan bash built-in true.

Jodie C
sumber