Ich bin heute auf ein Bash-Skript gestoßen, das Funktionsnamen mit doppelten Doppelpunkten enthält ::
, z . B. file::write()
und file::read()
. Ich habe diese Syntax noch nie in einem Bash-Skript gesehen, und als ich das Skript aufrief, lief es (zu meiner Überraschung) einwandfrei.
Nach dem Durchsuchen der Manpage von Bash auf meinem System (und online) kann ich in der Dokumentation nichts finden, was diese Syntax für Funktionsnamen unterstützt. Beispielsweise Shell Defined Functions
definiert der Abschnitt die Syntax für eine Shell-Funktion
function name [()] compound-command [redirection]
und dann (an anderer Stelle im Handbuch) ist das Token name
definiert als
name A word consisting only of alphanumeric characters and
underscores, and beginning with an alphabetic character
or an underscore. Also referred to as an identifier.
Die doppelte Doppelpunktsyntax für Funktionsnamen wird nirgendwo erwähnt.
Der einzige andere Verweis auf diese Doppelpunktsyntax, den ich bisher gefunden habe, befindet sich in diesem Shell Style Guide (siehe Unterabschnitt Naming Conventions > Function Names
), in dem die Verwendung der Doppelpunktsyntax für Funktionsnamen in "Paketen" empfohlen wird, z mypackage::myfunction()
.
Ist diese doppelte Doppelpunktsyntax für Funktionsnamen ein legitimes Merkmal der Bash-Shell, oder handelt es sich möglicherweise um ein undokumentiertes Merkmal? Wenn es legitim ist, wo ist es im Bash-Handbuch dokumentiert? Ich habe geschaut und geschaut, aber ich kann nichts darüber im Handbuch finden. Das nächste, was ich gefunden habe, ist die Verwendung von ::
in der PATH
Umgebungsvariablen, um das aktuelle Arbeitsverzeichnis zum Suchpfad hinzuzufügen.
BEISPIEL
#!/bin/bash
function abc::def() {
echo "${FUNCNAME[0]}"
}
abc::def
Ich habe dieses Skript auf drei verschiedenen Linux-Distributionen getestet, und auf allen drei wird das Skript abc::def
auf stdout gedruckt .
quelle
%%
in Funktionsnamen sehen, unix.stackexchange.com/questions/401166/…Antworten:
In diesem Fall ist die Dokumentation strenger als die Implementierung, möglicherweise um den Footgun-Faktor zu senken. Dies wurde hier zuvor diskutiert ; Siehe auch den ausführlichen Test, in dem festgestellt wird, dass es sich beispielsweise
[}{
um einen gültigen Funktionsnamen handelt.Es kann auch erwähnenswert sein, dass
abc::def
es sich nicht um einen gültigen Variablennamen handelt:quelle
file::read
weder[}{
ein gültiger Satz noch ein gültiger Satz