Secara historis , cangkang Bourne tidak memiliki truedan falsesebagai perintah bawaan. truebukan hanya alias :, dan falseuntuk sesuatu seperti let 0.
:sedikit lebih baik daripada trueuntuk portabilitas ke shell yang diturunkan dari Bourne kuno. Sebagai contoh sederhana, pertimbangkan untuk tidak memiliki !operator pipa atau ||operator daftar (seperti halnya beberapa cangkang Bourne kuno). Ini meninggalkan elseklausa ifpernyataan sebagai satu-satunya cara untuk bercabang berdasarkan status keluar:
if command; then :; else ...; fi
Karena ifmemerlukan thenklausa non-kosong dan komentar tidak dihitung sebagai non-kosong, :berfungsi sebagai larangan.
Saat ini (yaitu: dalam konteks modern) Anda biasanya dapat menggunakan salah satu :atau true. Keduanya ditentukan oleh POSIX, dan beberapa menemukan truelebih mudah dibaca. Namun ada satu perbedaan yang menarik: :adalah yang disebut POSIX khusus built-in , sedangkan trueadalah biasa built-in .
Dibangun khusus harus dibangun ke dalam shell; Built-in biasa hanya "biasanya" built-in, tetapi tidak dijamin sepenuhnya. Seharusnya tidak ada program reguler yang dinamai :dengan fungsi truedi PATH dari kebanyakan sistem.
Mungkin perbedaan yang paling penting adalah bahwa dengan built-in khusus, variabel apa pun yang ditetapkan oleh built-in - bahkan di lingkungan selama evaluasi perintah sederhana - tetap ada setelah perintah selesai, seperti yang ditunjukkan di sini menggunakan ksh93:
$ unset x; ( x=hi :; echo "$x" )
hi
$ ( x=hi true; echo "$x" )
$
Perhatikan bahwa Zsh mengabaikan persyaratan ini, seperti halnya GNU Bash kecuali ketika beroperasi dalam mode kompatibilitas POSIX, tetapi semua shell "POSIX sh turunan" utama lainnya mengamati ini termasuk dash, ksh93, dan mksh.
Perbedaan lainnya adalah built-in reguler harus kompatibel dengan exec- ditunjukkan di sini menggunakan Bash:
$ ( exec : )
-bash: exec: :: not found
$ ( exec true )
$
POSIX juga secara eksplisit mencatat bahwa :mungkin lebih cepat daripada true, meskipun ini tentu saja detail implementasi khusus.