Saya menemukan skrip Bash hari ini yang memiliki nama fungsi dengan titik dua ::
di dalamnya, misalnya, file::write()
dan file::read()
. Saya belum pernah melihat sintaks ini sebelumnya dalam skrip Bash, dan ketika saya mengaktifkan skrip itu berjalan dengan baik (mengejutkan saya).
Setelah menjelajahi halaman manual Bash di sistem saya (dan online), saya tidak dapat menemukan apa pun dalam dokumentasi yang mendukung sintaks ini untuk nama fungsi. Sebagai contoh, bagian ini Shell Defined Functions
mendefinisikan sintaks untuk fungsi shell menjadi
function name [()] compound-command [redirection]
dan kemudian (di tempat lain dalam manual) token name
didefinisikan sebagai
name A word consisting only of alphanumeric characters and
underscores, and beginning with an alphabetic character
or an underscore. Also referred to as an identifier.
Tidak ada sebutan sintaks kolon ganda untuk nama fungsi.
Satu-satunya referensi lain untuk sintaks kolon ganda ini yang saya temukan sejauh ini adalah dalam Panduan Gaya Shell ini (lihat subbagian Naming Conventions > Function Names
) yang merekomendasikan penggunaan sintaks kolon ganda untuk nama-nama fungsi dalam "paket" - misalnya mypackage::myfunction()
,.
Apakah sintaks kolon ganda ini untuk nama fungsi fitur yang sah dari shell Bash, atau mungkin ini fitur yang tidak didokumentasikan? Jika itu sah, di mana itu didokumentasikan dalam manual Bash? Saya telah melihat dan mencari tetapi saya tidak dapat menemukan apa pun tentang itu di manual. Yang paling dekat saya temukan adalah penggunaan ::
dalam PATH
variabel lingkungan untuk menambahkan direktori kerja saat ini ke jalur pencarian.
CONTOH
#!/bin/bash
function abc::def() {
echo "${FUNCNAME[0]}"
}
abc::def
Saya menguji skrip ini pada tiga distro Linux yang berbeda, dan pada ketiga skrip tersebut mencetak abc::def
ke stdout.
sumber
%%
dalam nama fungsi unix.stackexchange.com/questions/401166/…Jawaban:
Ini adalah kasus dokumentasi yang lebih ketat daripada implementasinya, mungkin dalam upaya menurunkan faktor footgun. Ini telah dibahas di sini sebelumnya ; lihat juga tes lengkap yang menetapkan bahwa misalnya
[}{
adalah nama fungsi yang valid.Mungkin juga patut dicatat bahwa
abc::def
itu bukan nama variabel yang valid:sumber
file::read
juga[}{
adalah POSIX berlaku