
Bei meinen Tests (in Bash und Z Shell) habe ich keine Probleme beim Definieren von Funktionen oder Aliasnamen oder ausführbaren Shell-Skripten festgestellt, deren Namen Bindestriche enthalten, aber ich bin nicht sicher, ob dies in allen Shells und in allen Anwendungsfällen in Ordnung ist.
Der Grund, warum ich dies tun möchte, besteht darin, dass ein Bindestrich einfacher zu tippen ist als ein Unterstrich und daher schneller und reibungsloser geht.
Ein Grund, warum ich nicht darauf vertrauen kann, dass es kein Problem ist, ist, dass in einigen Sprachen (zum Beispiel Ruby) der Bindestrich auch ohne Leerzeichen als Minuszeichen interpretiert wird. Es würde mich nicht überraschen, wenn so etwas in einigen Shells passieren könnte, wo der Bindestrich auch ohne Leerzeichen als Signal für eine Option interpretiert wird.
Ein weiterer Grund, warum ich etwas misstrauisch bin, ist, dass mein Texteditor die Syntaxhervorhebung für Funktionen mit Bindestrichen vermasselt. (Aber natürlich ist es durchaus möglich, dass es sich dabei nur um einen Fehler in der Syntaxhervorhebungskonfiguration für Shell-Skripte handelt.)
Gibt es einen Grund, Bindestriche zu vermeiden?
Antwort1
POSIX und Bindestriche: Keine Garantie
Gemäß dem POSIX-Standardein Funktionsnamemuss ein gültiger Name sein undein Namekann bestehen aus:
3.231 Bezeichnung
In der Shell-Befehlssprache ein Wort, das ausschließlich aus Unterstrichen, Ziffern und Buchstaben des portablen Zeichensatzes besteht. Das erste Zeichen eines Namens ist keine Ziffer.
Zusätzlich,ein Pseudonymmuss ein gültigerPseudonym, das bestehen kann aus:
3.10 Aliasname
In der Shell-Befehlssprache ein Wort, das ausschließlich aus Unterstrichen, Ziffern und Buchstaben des portablen Zeichensatzes sowie den folgenden Zeichen besteht: „!“, „%“, „,“, „@“.Implementierungen können als Erweiterung andere Zeichen innerhalb von Aliasnamen zulassen. (Hervorhebung von mir.)
Ein Bindestrich istnichtsind unter den Zeichen aufgeführt, die in beiden Fällen zulässig sein müssen. Wenn sie verwendet werden, ist die Portabilität daher nicht gewährleistet.
Beispiele für Shells, die keine Bindestriche unterstützen
dash
ist die Standard-Shell ( /bin/sh
) der Debian-Ubuntu-Familie und unterstützt keine Bindestriche in Funktionsnamen:
$ a-b() { date; }
dash: 1: Syntax error: Bad function name
InteressanterweisetutBindestriche in Aliasnamen werden unterstützt, obwohl dies, wie oben erwähnt, einImplementierungsmerkmal, keine Voraussetzung:
$ a_b() { printf "hello %s\n" "$1"; }
$ alias a-b='a_b'
$ a-b world
hello world
Die Busybox-Shell (nur die auf Ash basierende) unterstützt ebenfalls keine Bindestriche in Funktionsnamen:
$ a-b() { date; }
-sh: Syntax error: Bad function name
Zusammenfassung der Hyphen-Unterstützung durch Shell
Die folgenden Shells unterstützen nachweislich Bindestriche in Funktionsnamen:
- pdksh und Derivate, bash, zsh
- einige Ash-Derivate wie das sh von FreeBSD (seit 2010) oder NetBSD (seit 2016).
- busybox sh, wenn die zur Kompilierungszeit ausgewählte Shell
hush
anstelle von istash
. - csh und tcsh (in ihren Aliasnamen haben diese Shells keine Funktionsunterstützung). Diese Shells haben ohnehin eine radikal andere Syntax, daher besteht keine Hoffnung auf Shell-übergreifende Kompatibilität mit ihnen.
- rc und Ableitungen (wiederum mit einer radikal anderen Syntax)
- fish (wieder mit einer radikal anderen Syntax)
Folgende Granaten sind bekanntnichtum Bindestriche in Funktionsnamen zu unterstützen:
- die Bourne-Shell und Derivate wie ksh88 und bosh (in der Bourne-Shell teilten sich Funktionen und Variablen den gleichen Namespace, eine Variable und eine Funktion konnten nicht den gleichen Namen haben).
- ksh93, yash, das Original-Ash und einige seiner Derivate (Busybox Ash (die Standardauswahl für Sh), Dash)
Schlussfolgerungen
- Bindestriche sind kein Standard. Vermeiden Sie sie, wenn Sie Shell-übergreifende Kompatibilität wünschen.
- Verwenden Sie Unterstriche statt Bindestriche: Unterstriche werden überall akzeptiert.
Antwort2
Ich weiß, dass das wirklich spät ist, aber vielleicht können Sie Ihr Problem umgehen, indem Sie den Unterstrich zugänglicher machen.
xmodmap -e "keycode 20 = underscore minus"
Dadurch wird der Unterstrich durch einen Bindestrich (Minus) ersetzt.
Jetzt halten Sie also die Umschalttaste gedrückt, um einen Bindestrich einzugeben, ein Unterstrich wird jedoch ohne Umschalttaste eingegeben.
Ihr Tastencode kann jedoch anders sein. Ich denke jedoch, dass es von Ihrer Tastatur abhängt. Meine ist zufällig 20. Sagen Sie mir einfach Bescheid, wenn Sie Hilfe benötigen, um herauszufinden, welchen Tastencode Sie verwenden müssen.