Ci sono problemi con trattini in funzioni, alias ed eseguibili?


25

Nei miei test (in Bash e Z Shell), non ho riscontrato problemi con la definizione di funzioni o alias o script shell eseguibili che hanno trattini nel nome, ma non sono sicuro che questo andrà bene in tutte le shell e in tutti i casi d'uso .

Il motivo per cui vorrei fare questo è che un trattino è più facile da digitare di un carattere di sottolineatura, e quindi più veloce e fluido.

Uno dei motivi per cui esito a credere che non sia un problema è che in alcune lingue (ad esempio Ruby) il trattino sarebbe interpretato come un segno meno anche senza spazi attorno. Non mi sorprenderebbe se qualcosa del genere potesse accadere in alcune conchiglie, dove il trattino viene interpretato come segnale di un'opzione anche senza uno spazio.

Un altro motivo per cui sono un po 'sospettoso è che il mio editor di testo rovina l'evidenziazione della sintassi per le funzioni con trattini. (Ma ovviamente è del tutto possibile che si tratti solo di un bug nella sua sintassi che evidenzia la configurazione per gli script di shell.)

C'è qualche motivo per evitare trattini?

Risposte:


32

POSIX e trattini: nessuna garanzia

Secondo lo standard POSIX, un nome di funzione deve essere un nome valido e un nome può essere costituito da:

3.231 Nome
Nel linguaggio dei comandi della shell, una parola composta esclusivamente da caratteri di sottolineatura, cifre e alfabeti dal set di caratteri portatile. Il primo carattere di un nome non è una cifra.

Inoltre, un alias deve essere un nome alias valido , che può consistere in:

3.10 Nome alias
Nella lingua dei comandi della shell, una parola composta esclusivamente da caratteri di sottolineatura, cifre e alfabeti dal set di caratteri portatile e da uno dei seguenti caratteri: '!', '%', ',', '@'.

Le implementazioni possono consentire altri caratteri all'interno di nomi alias come estensione. (Enfasi mia.)

Un trattino non è elencato tra i caratteri che devono essere consentiti in entrambi i casi. Pertanto, se utilizzati, la portabilità non è garantita.

Esempi di conchiglie che non supportano i trattini

dashè la shell predefinita ( /bin/sh) della famiglia debian-ubuntu e non supporta trattini nei nomi delle funzioni:

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

È interessante notare, si fa trattini di supporto a pseudonimi, anche se, come osservato in precedenza, si tratta di una caratteristica di implementazione , non è un requisito:

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

La shell busybox (Almquist shell) non supporta anche i trattini nei nomi delle funzioni:

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

Riepilogo del supporto Hyphen di Shell

È noto che le seguenti shell supportino trattini nei nomi delle funzioni:

  • ksh, bash, zsh

È noto che le seguenti shell non supportano trattini nei nomi delle funzioni:

  • ash (busybox), csh, tcsh, trattino

conclusioni

  • I trattini non sono standard. Stai lontano da loro se vuoi la compatibilità cross-shell.
  • Usa trattini bassi anziché trattini: i trattini bassi sono accettati ovunque.

2
I nomi con -dentro sono cattivi. Ti sto guardando, CSS. :)
PM 2Ring

Grazie. Ho provato più tardi cshe tcshnon supportano neanche i trattini, ma la shell Korn ha fatto. È un po 'divertente che ho usato anche a-b()come nome della mia funzione.
iconoclasta,

@iconoclast Ho aggiunto i risultati dei tuoi shell test alla risposta. Grazie.
Giovanni 1024

@ PM2Ring sono più facili da digitare rispetto ai nomi con caratteri di sottolineatura. Escludendo la tradizione o le decisioni di implementazione dei sistemi che non li consentono, quale principio puoi indicare per sostenere l'affermazione che sono cattivi?
iconoclasta

1
@iconoclast I nomi con trattini sono impossibili in molte lingue, poiché il trattino viene interpretato come un segno meno, quindi se tale linguaggio deve interagire con una lingua che supporta i nomi con trattini si ottiene la situazione disordinata in cui le entità con nomi sillabati sono costrette a hanno un nome diverso nell'altra lingua.
PM 2Ring

3

So che è molto tardi, ma forse puoi aggirare il problema di rendere il carattere di sottolineatura più accessibile.

xmodmap -e "keycode  20 =  underscore minus"

Questo cambierà la sottolineatura con trattino (meno).

Quindi ora tieni premuto shift per trattino, ma un carattere di sottolineatura viene digitato senza maiusc.

Il tuo codice chiave potrebbe essere diverso, tuttavia, penso che dipenda dalla tua tastiera; il mio sembra essere 20. Fammi sapere se hai bisogno di aiuto per trovare quale codice chiave devi usare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.