Apakah ada masalah dengan tanda hubung dalam fungsi, alias, dan executable?

25

Dalam pengujian saya (dalam Bash dan Z Shell), saya tidak melihat masalah dengan mendefinisikan fungsi atau alias atau skrip shell yang dapat dieksekusi yang memiliki tanda hubung dalam namanya, tapi saya tidak yakin bahwa ini akan baik-baik saja di semua shell dan dalam semua kasus penggunaan .

Alasan saya ingin melakukan ini adalah bahwa tanda hubung lebih mudah diketik daripada garis bawah, dan karena itu lebih cepat dan lebih halus.

Salah satu alasan saya ragu untuk percaya bahwa itu bukan masalah adalah bahwa dalam beberapa bahasa (Ruby misalnya) tanda hubung akan ditafsirkan sebagai tanda minus bahkan tanpa spasi di sekitarnya. Itu tidak akan mengejutkan saya jika sesuatu seperti ini mungkin terjadi di beberapa shell, di mana tanda hubung ditafsirkan sebagai menandakan pilihan bahkan tanpa spasi.

Alasan lain saya agak curiga adalah karena editor teks saya mengacaukan sintaks untuk fungsi dengan tanda hubung. (Tapi tentu saja sangat mungkin bahwa itu hanya bug dalam sintaksnya yang menyoroti konfigurasi untuk skrip shell.)

Apakah ada alasan untuk menghindari tanda hubung?

iconoclast
sumber

Jawaban:

32

POSIX dan tanda hubung: Tidak Ada Jaminan

Menurut standar POSIX, nama fungsi harus nama yang valid dan nama dapat terdiri dari:

3.231 Nama
Dalam bahasa perintah shell, kata yang hanya terdiri dari garis bawah, digit, dan alfabet dari set karakter portabel. Karakter pertama dari sebuah nama bukan digit.

Selain itu, alias harus berupa nama alias yang valid , yang dapat terdiri dari:

3.10 Nama Alias
Dalam bahasa perintah shell, kata yang hanya terdiri dari garis bawah, digit, dan alfabet dari set karakter portabel dan salah satu karakter berikut: '!', '%', ',', '@'.

Implementasi dapat memungkinkan karakter lain dalam nama alias sebagai ekstensi. (Penekanan milikku.)

Tanda hubung tidak tercantum di antara karakter yang harus diizinkan dalam kedua kasus. Jadi, jika digunakan, portabilitas tidak dijamin.

Contoh Kerang Yang Tidak Mendukung Tanda Hubung

dashadalah shell default ( /bin/sh) pada keluarga debian-ubuntu dan tidak mendukung tanda hubung dalam nama fungsi:

$ a-b() { date; }
dash: 1: Syntax error: Bad function name

Yang cukup menarik, ini mendukung tanda hubung dalam alias, meskipun, seperti disebutkan di atas, ini adalah karakteristik implementasi , bukan persyaratan:

$ a_b() { printf "hello %s\n" "$1"; }
$ alias a-b='a_b'
$ a-b world
hello world

Shell busybox (Almquist shell) juga tidak mendukung tanda hubung dalam nama fungsi:

$ a-b() { date; }
-sh: Syntax error: Bad function name

Ringkasan Dukungan Tanda Hubung oleh Shell

Kerang berikut dikenal untuk mendukung tanda hubung dalam nama fungsi:

  • ksh, bash, zsh

Kerang berikut diketahui tidak mendukung tanda hubung dalam nama fungsi:

  • ash (busybox), csh, tcsh, dash

Kesimpulan

  • Tanda hubung tidak standar. Jauhi mereka jika Anda ingin kompatibilitas lintas-shell.
  • Gunakan garis bawah sebagai ganti tanda hubung: garis bawah diterima di mana-mana.
John1024
sumber
2
Nama-nama -di dalamnya jahat. Saya melihat Anda, CSS. :)
PM 2Ring
Terima kasih. Saya diuji kemudian cshdan tcshdan mereka juga tidak mendukung tanda hubung, tetapi Korn shell melakukannya. Ini sedikit lucu yang saya gunakan a-b()sebagai nama fungsi saya juga.
iconoclast
@iconoclast Saya menambahkan hasil tes shell Anda ke jawabannya. Terima kasih.
John1024
@ PM2Ring mereka lebih mudah diketik daripada nama dengan garis bawah. Tidak termasuk tradisi atau keputusan implementasi sistem yang tidak memungkinkannya, prinsip apa yang dapat Anda tunjukkan untuk mendukung klaim bahwa mereka jahat?
iconoclast
1
@iconoclast Nama-nama dengan tanda hubung tidak mungkin dalam banyak bahasa, karena tanda hubung diartikan sebagai tanda minus, jadi jika bahasa seperti itu perlu diintegrasikan dengan bahasa yang mendukung nama-nama dengan tanda hubung Anda mendapatkan situasi berantakan di mana entitas dengan nama ditulis dgn tanda penghubung terpaksa memiliki nama berbeda dalam bahasa lain.
PM 2Ring
3

Saya tahu ini benar-benar terlambat, tetapi mungkin Anda dapat mengatasi masalah Anda untuk membuat garis bawah lebih mudah diakses.

xmodmap -e "keycode  20 =  underscore minus"

Ini akan beralih garis bawah dengan tanda hubung (minus).

Jadi sekarang, Anda menahan shift untuk tanda hubung, tetapi garis bawah diketik tanpa shift.

Kode kunci Anda mungkin berbeda, namun, saya pikir itu tergantung pada keyboard Anda; saya kebetulan berusia 20. Hanya beri tahu saya jika Anda perlu bantuan menemukan kode kunci apa yang perlu Anda gunakan.

TuxForLife
sumber