Die Verwendung erweiterter Unicode-Zeichen ist (ohne Zweifel) für viele Benutzer nützlich.
Einfachere Shells (ash (busybox), dash) und ksh schlagen fehl mit:
tést() { echo 34; }
tést
Aber bash , mksh , lksh und zsh scheinen es zu erlauben.
Mir ist bekannt, dass POSIX- gültige Funktionsnamen diese Definition von Namen verwenden . Das heißt dieser reguläre Ausdruck:
[a-zA-Z_][a-zA-Z0-9_]*
Im ersten Link heißt es jedoch auch:
Eine Implementierung kann andere Zeichen in einem Funktionsnamen als Erweiterung zulassen.
Die Fragen sind:
- Wird dies akzeptiert und dokumentiert?
- Wo?
- Für welche Muscheln (falls vorhanden)?
Verwandte Fragen:
Ist es möglich, Sonderzeichen in einem Shell-Funktionsnamen zu verwenden?
Ich bin nicht daran interessiert, Metazeichen (>) in Funktionsnamen zu verwenden.
Namen von Upstart- und Bash-Funktionen, die "-" enthalten
Ich glaube nicht, dass ein Operator (Subtraktion "-") Teil eines Namens sein sollte.
alias
etwas nachsichtiger sein. und so können Sie die Funktion mit einem richtigen, heruntergeknöpften Namen schreiben und dann einfach einen eleganteren Aliasnamen definieren, um die Funktion aufzurufen. indash
dort auch einige Sachen sind , können Sie mit tun$PATH
und%func
.Antworten:
Da die POSIX-Dokumentation dies als Erweiterung zulässt, steht der Implementierung dieses Verhaltens nichts entgegen.
Ein einfacher Check (lief ein
zsh
):zeigen , dass
bash
,zsh
,yash
,ksh93
(welche inksh
Verbindung mit in meinem System)pdksh
und seine Ableitung ermöglichen Mehrbytes Zeichen als Funktionsnamen.yash
unterstützt von Anfang an Multibyte-Zeichen , daher ist es nicht verwunderlich, dass es funktioniert hat.Die andere Dokumentation, auf die Sie verweisen können, ist
ksh93
:So setzen Sie auf
C
Gebietsschema:machen es fehlgeschlagen.
quelle
posh
ist es nicht wert, in einer solchen Liste aufgeführt zu werden. Dies hängt von Linux-spezifischen Fehlern ablibc
und funktioniert auf anderen Plattformen nicht.ksh93
Verwendung eines selbst kompilierten ksh93 aus Originalquellen nicht wiederholen . Währendksh88
offenbar Nicht-7-Bit-ASCII-Buchstaben für Funktionsnamenksh93
akzeptiert werden, scheint sie nur die Binärdatei von Ubuntu zu akzeptieren.Beachten Sie, dass Funktionen denselben Namespace wie andere Befehle haben, einschließlich der Befehle im Dateisystem, die auf den meisten Systemen keine Beschränkung hinsichtlich der Zeichen oder sogar Bytes haben, die sie in ihrem Pfad enthalten können.
Während die meisten Shells die Charaktere ihrer Funktionen einschränken, gibt es keinen wirklich guten Grund, warum sie das tun würden. Das heißt, in diesen Shells gibt es Befehle, die Sie nicht durch eine Funktion ersetzen können.
zsh
undrc
erlauben Sie alles für ihre Funktionsnamen, einschließlich einiger mit/
und der leeren Zeichenfolge.zsh
erlaubt sogar NUL Bytes.Ein einfacher Befehl in der Shell ist eine Liste von Argumenten, und das erste Argument wird verwendet, um den auszuführenden Befehl abzuleiten. Es ist also nur logisch, dass diese Argumente und Funktionsnamen die gleichen möglichen Werte haben und in
zsh
Argumenten für integrierte Funktionen und Funktionen eine beliebige Bytefolge verwendet werden kann.Hier gibt es keine Sicherheitslücke, da die Funktionen, die Sie (der Autor des Skripts) definieren, diejenigen sind, die Sie aufrufen.
Sicherheitsprobleme treten möglicherweise auf, wenn die Analyse von der Umgebung beeinflusst wird, z. B. bei Shells, bei denen die gültigen Namen für Funktionen vom Gebietsschema abhängen.
quelle
function /bin/sh { echo "$0: $FUNCNAME: Permission denied"; return 126; }
und potentiell nützliche Dinge auch mit Funktionen genannt--
,//
,@
oder%
usw./
sie in einem Namen gefunden werden? und eine Funktion ist nicht nur ein ausführbarer Name - ihr Code. Ich würde denken, dass eine einfache Implementierung auf eine Menge von Analyseproblemen stoßen könnte, wenn die gespeicherten Funktionsnamen Metazeichen enthalten.