Gibt es Probleme mit Bindestrichen in Funktionen, Aliasen und ausführbaren Dateien?


25

In meinen Tests (in Bash und Z Shell) habe ich keine Probleme beim Definieren von Funktionen oder Aliasen oder ausführbaren Shell-Skripten mit Bindestrichen im Namen festgestellt, aber ich bin nicht sicher, dass dies in allen Shells und in allen Anwendungsfällen in Ordnung ist .

Der Grund, warum ich dies tun möchte, ist, dass ein Bindestrich einfacher einzugeben ist als ein Unterstrich und daher schneller und glatter.

Ein Grund, warum ich nicht sicher bin, dass dies kein Problem ist, ist, dass in einigen Sprachen (z. B. 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, in denen der Bindestrich als Signal für eine Option interpretiert wird, auch ohne Leerzeichen.

Ein weiterer Grund, warum ich ein wenig misstrauisch bin, ist, dass mein Texteditor die Syntaxhervorhebung für Funktionen mit Bindestrichen durcheinander bringt. (Aber natürlich ist es durchaus möglich, dass dies nur ein Fehler in der Syntax der Hervorhebungskonfiguration für Shell-Skripte ist.)

Gibt es einen Grund, Bindestriche zu vermeiden?

Antworten:


32

POSIX und Bindestriche: Keine Garantie

Gemäß dem POSIX-Standard muss ein Funktionsname ein gültiger Name sein und ein Name kann bestehen aus:

3.231 Name
In der Shell-Befehlssprache ein Wort, das ausschließlich aus Unterstrichen, Ziffern und Buchstaben aus dem portablen Zeichensatz besteht. Das erste Zeichen eines Namens ist keine Ziffer.

Darüber hinaus muss ein Alias ein gültiger Aliasname sein , der aus folgenden Elementen bestehen kann:

3.10 Aliasname
In der Shell-Befehlssprache ein Wort, das ausschließlich aus Unterstrichen, Ziffern und Buchstaben aus dem portablen Zeichensatz und einem der folgenden Zeichen besteht: '!', '%', ',', '@'.

Implementierungen können andere Zeichen in Aliasnamen als Erweiterung zulassen. (Betonung meiner.)

In den Zeichen, die in beiden Fällen zulässig sein müssen, wird kein Bindestrich aufgeführt. Wenn sie verwendet werden, kann die Portabilität nicht garantiert werden.

Beispiele für Shells, die keine Bindestriche unterstützen

dashist die Standardshell ( /bin/sh) in der debian-ubuntu-Familie und unterstützt keine Bindestriche in Funktionsnamen:

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

Interessanterweise ist es tut Unterstützung Bindestriche in Aliase, obwohl, wie oben erwähnt, ist dies eine ist Implementierung charakteristisch , keine Voraussetzung:

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

Die Busybox-Shell (Almquist-Shell) unterstützt auch keine Bindestriche in Funktionsnamen:

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

Zusammenfassung der Unterstützung von Bindestrichen durch Shell

Die folgenden Shells unterstützen Bindestriche in Funktionsnamen:

  • ksh, bash, zsh

Die folgenden Shells unterstützen bekanntermaßen keine Bindestriche in Funktionsnamen:

  • ash (busybox), csh, tcsh, dash

Schlussfolgerungen

  • Bindestriche sind nicht Standard. Halten Sie sich von ihnen fern, wenn Sie Cross-Shell-Kompatibilität wünschen.
  • Verwenden Sie Unterstriche anstelle von Bindestrichen: Unterstriche werden überall akzeptiert.

2
Namen mit -in ihnen sind böse. Ich sehe dich an, CSS. :)
PM 2Ring

Vielen Dank. Ich habe später in cshund getestet tcshund sie unterstützen auch keine Bindestriche, aber die Korn-Shell hat es getan. Es ist ein bisschen komisch, dass ich auch a-b()meinen Funktionsnamen verwendet habe.
Iconoclast

@iconoclast Ich habe die Ergebnisse Ihrer Hüllentests zur Antwort hinzugefügt. Vielen Dank.
John1024

@ PM2Ring Sie sind einfacher zu tippen als Namen mit Unterstrichen. Welchen Grundsatz können Sie unter Ausschluss von Traditions- oder Implementierungsentscheidungen von Systemen, die diese nicht zulassen, als Beleg für die Behauptung heranziehen, sie seien böse?
Iconoclast

1
@iconoclast Namen mit Bindestrichen sind in vielen Sprachen nicht möglich, da der Bindestrich als Minuszeichen interpretiert wird. Wenn eine solche Sprache also mit einer Sprache zusammenarbeiten muss, die Namen mit Bindestrichen unterstützt, kommt es zu einer chaotischen Situation, in der Entitäten mit Bindestrichen gezwungen werden einen anderen Namen in der anderen Sprache haben.
PM 2Ring

3

Ich weiß, dass dies 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"

Dies schaltet den Unterstrich mit einem Bindestrich (Minus) um.

Jetzt halten Sie die Umschalttaste für den Bindestrich gedrückt, aber ein Unterstrich wird ohne Umschalttaste eingegeben.

Ihr Schlüsselcode kann unterschiedlich sein. Ich denke jedoch, dass er von Ihrer Tastatur abhängt. meins ist zufällig 20. Sagen Sie mir einfach Bescheid, wenn Sie Hilfe benötigen, um den zu verwendenden Schlüsselcode zu finden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.