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 diff
through automatisch auszuführen colordiff
und less -R
ich 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 which
das 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/fossil
eine andere sein Zeichenfolge ausfossil
, so, wenn Sie sagen/usr/bin/fossil
, es nicht versuchen , das auszuführenfossil
Funktion.Antworten:
Verwenden Sie die
command
eingebaute Shell:quelle
\date
.In Skripten wird die
#!
Zeile häufig verwendet/bin/env bash
, um den Bash-Befehl basierend auf dem Pfad auszuführen. (Dies kann bei einigen Dienstprogrammen abweichen.) Das sollte auch hier funktionieren ...(Die
command
Alternative sollte ebenfalls funktionieren, ist jedoch möglicherweise von einer bestimmten Shell abhängig.) (Sie funktioniert auf der Bourne-Shell unter Solaris, wird jedoch/bin/command
in dem Fall ausgeführt, bei dem es sich um eine in Bash integrierte Shell handelt.)Beide
/bin/command
und/bin/env
sind in SUS aufgeführt, daher sollten sie für alle kompatiblen Implementierungen verfügbar sein.quelle
env
. Ich hatte Zweifel, welche Antwort ich akzeptieren sollte, aber da es sich bei der Frage um Bash handelt ,command
ist die integrierte Lösung die beste.command
ausführbare Datei, sonderncommand
funktioniert auch indash
,ksh
undzsh
. Ich gehe also davon aus, dass es sich um eine Shell handelt, die nicht nur eingebaut istbash
. pastebin.com/fi3gyNse/bin/env
nach dem Hash-Knall verwendet werden, wenn sie den Shell-Pfad nicht hart codieren möchten.)Gerts Antwort ließ mich erkennen, dass man es auch
nice
für den Zweck verwenden kann (ich hatte es tatsächlich in einem meiner Skripte, ohne es zu merken):Es ist weniger elegant als die anderen Antworten, aber unter bestimmten Umständen kann es eine nützliche Option sein.
quelle
`which date`
.`which something`
ist, dass, wenn es keinesomething
ausführbare Datei gibt, unglückliche Dinge passieren können. Wenn zum Beispiel etwasecho
fehlt, dann`which echo` /bin/rm preciousFile
geschieht etwas ganz anderes als beabsichtigt.