Bash-Skript-Funktionsnamen mit Doppelpunkt '::'

17

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 Functionsdefiniert der Abschnitt die Syntax für eine Shell-Funktion

function name [()] compound-command [redirection]

und dann (an anderer Stelle im Handbuch) ist das Token namedefiniert 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 PATHUmgebungsvariablen, 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::defauf stdout gedruckt .

Jim Fischer
quelle
Man kann auch %%in Funktionsnamen sehen, unix.stackexchange.com/questions/401166/…
Michael
Danke für die Links. Seltsam. Vor dem Posten habe ich nach "bash double colon" (ohne Anführungszeichen) gesucht, aber nichts gefunden. Entschuldigung für die erneute Beantwortung einer bereits beantworteten Frage. .
Jim Fischer

Antworten:

16

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::defes sich nicht um einen gültigen Variablennamen handelt:

$ abc::def=foo
bash: abc::def=foo: command not found
l0b0
quelle
4
Nur um es anschaulich zu machen - es ist file::readweder [}{ein gültiger Satz noch ein gültiger Satz
Steven Penny