Menggunakan karakter Unicode yang diperluas (tidak diragukan) bermanfaat bagi banyak pengguna.
Kerang yang lebih sederhana (abu (busybox), tanda hubung) dan ksh gagal dengan:
tést() { echo 34; }
tést
Tapi bash , mksh , lksh , dan zsh tampaknya memungkinkan.
Saya sadar bahwa nama fungsi POSIX yang valid menggunakan definisi Nama - nama ini . Itu berarti regex ini:
[a-zA-Z_][a-zA-Z0-9_]*
Namun, pada tautan pertama dikatakan juga:
Implementasi dapat memungkinkan karakter lain dalam nama fungsi sebagai ekstensi.
Pertanyaannya adalah:
- Apakah ini diterima dan didokumentasikan?
- Dimana?
- Untuk cangkang mana (jika ada)?
Pertanyaan terkait: Apakah
mungkin menggunakan karakter khusus dalam nama fungsi shell?
Saya tidak tertarik menggunakan meta-karakter (>) dalam nama fungsi.
Nama fungsi pemula dan bash yang mengandung "-"
Saya tidak percaya bahwa operator (pengurangan "-") harus menjadi bagian dari nama.
alias
sedikit lebih toleran. dan jadi Anda dapat menulis fungsi dengan nama yang tepat, tombol-down, dan kemudian hanya mendefinisikan alias lebih bergaya bernama untuk memanggil fungsi. didash
sana juga ada beberapa hal yang dapat Anda lakukan dengan$PATH
dan%func
.Jawaban:
Karena dokumentasi POSIX memungkinkannya sebagai ekstensi, tidak ada yang mencegah implementasi dari perilaku itu.
Pemeriksaan sederhana (ran
zsh
):menunjukkan bahwa
bash
,zsh
,yash
,ksh93
(yangksh
terhubung ke dalam sistem saya),pdksh
dan derivasi yang memungkinkan multi-byte karakter sebagai nama fungsi.yash
dirancang untuk mendukung karakter multibyte sejak awal, jadi tidak ada kejutan itu berhasil.Dokumentasi lain yang dapat Anda rujuk adalah
ksh93
:Jadi pengaturan ke
C
lokal:buat itu gagal.
sumber
posh
tidak layak untuk dicantumkan dalam daftar seperti itu. Itu tergantung pada bug khusus Linux dilibc
dan tidak akan bekerja pada platform lain.ksh93
penggunaan ksh93 yang dikompilasi sendiri dari sumber asli. Meskipunksh88
tampaknya menerima huruf non-7-Bit-ASCII untuk nama fungsi, hanyaksh93
biner dari Ubuntu yang menerimanya.Perhatikan bahwa fungsi berbagi namespace yang sama dengan perintah lain termasuk perintah dalam sistem file, yang pada kebanyakan sistem tidak memiliki batasan pada karakter atau bahkan byte yang mungkin ada di jalurnya.
Jadi, sementara sebagian besar shell membatasi karakter fungsi mereka, tidak ada alasan nyata mengapa mereka melakukan itu. Itu berarti di shells itu, ada perintah yang tidak bisa Anda ganti dengan fungsi.
zsh
danrc
mengizinkan apa pun untuk nama fungsi mereka termasuk beberapa dengan/
dan string kosong.zsh
bahkan memungkinkan byte NUL.Perintah sederhana di shell adalah daftar argumen, dan argumen pertama digunakan untuk menurunkan perintah untuk dieksekusi. Jadi, logis bahwa argumen dan nama fungsi tersebut berbagi nilai yang mungkin sama dan dalam
zsh
argumen untuk builtin dan fungsi dapat berupa urutan byte apa pun.Tidak ada masalah keamanan di sini karena fungsi yang Anda (penulis skrip) tetapkan adalah yang Anda panggil.
Di mana mungkin ada masalah keamanan adalah ketika parsing dipengaruhi oleh lingkungan, misalnya dengan shell di mana nama yang valid untuk fungsi dipengaruhi oleh lokal.
sumber
function /bin/sh { echo "$0: $FUNCNAME: Permission denied"; return 126; }
, dan hal-hal yang berpotensi bermanfaat juga dengan fungsi yang dinamai--
,//
,@
atau%
dll/
ditemukan dalam sebuah nama? dan fungsi bukan hanya nama yang dapat dieksekusi - kodenya. saya akan berpikir implementasi sederhana bisa menghadapi banyak masalah parse jika nama fungsi yang tersimpan termasuk metacharacters.