Manchmal definiere ich eine Funktion, die eine ausführbare Datei spiegelt und deren Argumente oder Ausgabe optimiert. Die Funktion hat also den gleichen Namen wie die ausführbare Datei, und ich brauche eine Möglichkeit, wie die ausführbare Datei von der Funktion ausgeführt werden kann, ohne die Funktion rekursiv aufzurufen. Zum Beispiel, um die Ausgabe von fossil diffthrough automatisch auszuführen colordiffund less -Rich verwende:
function fossil () {
local EX=$(which fossil)
if [ -z "$EX" ] ; then
echo "Unable to find 'fossil' executable." >&2
return 1
fi
if [ -t 1 ] && [ "$1" == "diff" ] ; then
"$EX" "$@" | colordiff | less -R
return
fi
"$EX" "$@"
}
Wenn ich mir sicher wäre, wo sich die ausführbare Datei befindet, könnte ich sie einfach eingeben /usr/bin/fossil. Bash erkennt, dass /der Befehl eine ausführbare Datei und keine Funktion ist. Da ich den genauen Standort nicht kenne, muss ich whichdas Ergebnis abrufen und überprüfen. Gibt es einen einfacheren Weg?
/der Befehl eine ausführbare Datei und keine Funktion ist.“ Genau genommen stimmt das nicht. In einer meiner Meinung nach schrecklichen (undokumentierten) Entwurfsentscheidung lässt bash zu, dass Funktionsnamen Schrägstriche enthalten. Die Schrägstriche einfach verursachen/usr/bin/fossileine andere sein Zeichenfolge ausfossil, so, wenn Sie sagen/usr/bin/fossil, es nicht versuchen , das auszuführenfossilFunktion.