Was muss ich beachten, wenn ich eine Bash-Funktion so definiere, dass sie den Namen eines Programms verwendet?

Was muss ich beachten, wenn ich eine Bash-Funktion so definiere, dass sie den Namen eines Programms verwendet?

In vielen Fällen muss ich Funktionen mit demselben Namen wie andere Programme erstellen und ich habe keine Ahnung, ob das eine gute Möglichkeit ist, Bash-Skripting zu verwenden.

Beispiel:

    function echo () {
        echo -n "$@" ;
    }  

Nach dem Testen sieht es so aus, als ob es Funktionsnamen im Skript vor Binärpfaden prüft. Ich möchte das und alle anderen Informationen, die ich wissen sollte, sicherstellen.

Antwort1

echo() {
  command echo -n "$@"
}

Die Verwendung commandhier bedeutet, dass nach dem echoBefehl (der hier zufällig integriert ist) und nicht nach der Funktion gefragt wird, die sonst Vorrang hätte.

Und da es sich hier echozufällig auch um ein integriertes Element handelt (wird übrigens nicht nachgeschlagen, $PATHda integrierte Elemente Vorrang vor Dateisystembefehlen haben), können Sie auch Folgendes tun:

echo() {
  builtin echo -n "$@"
}

Dieser letztere Ansatz ist in vorzuziehen zsh, wo stattdessen command echoausgeführt würde /bin/echo(außer bei shEmulation).

Es gibt einige geringfügige Unterschiede zwischen den Shells, die Rangfolge ist jedoch im Allgemeinen:

  1. spezielle Einbauten
  2. Funktionen
  3. eingebaute
  4. Befehle in $PATH(und die Reihenfolge hängt von der Reihenfolge in $PATHund in der hashTabelle ab, wie sie vom hashintegrierten Befehl verwaltet wird)

Beachten Sie, dass Aliase und Schlüsselwörter in der Shell-Syntax ( for, if...), wenn sie nicht in Anführungszeichen stehen, vor diesen berücksichtigt werden.

Die Reihenfolge von 1und 2ist in einigen Shells, wie etwa bashoder , umgekehrt zsh. bashLässt nicht zu, dass Funktionen mit demselben Namen wie ein spezielles integriertes Element definiert werden, wenn sie als aufgerufen werden sh.

verwandte Informationen