Nama fungsi skrip Bash yang berisi tanda titik dua '::'


17

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 Functionsmendefinisikan sintaks untuk fungsi shell menjadi

function name [()] compound-command [redirection]

dan kemudian (di tempat lain dalam manual) token namedidefinisikan 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 PATHvariabel 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::defke stdout.



Seseorang juga dapat melihat %%dalam nama fungsi unix.stackexchange.com/questions/401166/…
michael

Terima kasih atas tautannya. Aneh. Sebelum memposting saya mencari "bash double colon" (tanpa tanda kutip) tetapi tidak menemukan apa pun. Permintaan maaf karena mengajukan kembali pertanyaan yang sudah dijawab. .
Jim Fischer

Jawaban:


16

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::defitu bukan nama variabel yang valid:

$ abc::def=foo
bash: abc::def=foo: command not found

4
hanya untuk membuatnya jelas jelas - tidak file::readjuga [}{adalah POSIX berlaku
Steven Penny
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.