Es gibt eine ähnliche Frage , die sich mit dem 'Wrapping'-Szenario befasst, bei dem Sie beispielsweise cd
einen Befehl verwenden möchten , der das eingebaute Element aufruft cd
.
Angesichts von Shellshock et al. Und der Tatsache, dass Bash Funktionen aus der Umgebung importiert, habe ich einige Tests durchgeführt und kann das Builtin nicht sicher cd
aus meinem Skript aufrufen .
Bedenken Sie
cd() { echo "muahaha"; }
export -f cd
Alle Skripte, die in dieser Umgebung mit aufgerufen cd
werden, brechen ab (berücksichtigen Sie die Auswirkungen von etwas Ähnlichem cd dir && rm -rf .
).
Es gibt Befehle zum Überprüfen des Typs eines Befehls (bequemer Aufruf type
) und Befehle zum Ausführen der eingebauten Version anstelle einer Funktion ( builtin
und command
). Aber siehe da, diese können auch mit Funktionen überschrieben werden
builtin() { "$@"; }
command() { "$@"; }
type() { echo "$1 is a shell builtin"; }
Ergibt Folgendes:
$ type cd
cd is a shell builtin
$ cd x
muahaha
$ builtin cd x
muahaha
$ command cd x
muahaha
Gibt es eine Möglichkeit, bash sicher zur Verwendung des integrierten Befehls zu zwingen oder zumindest zu erkennen, dass ein Befehl kein integrierter Befehl ist, ohne die gesamte Umgebung zu löschen?
Mir ist klar, dass Sie wahrscheinlich sowieso bescheuert sind, wenn jemand Ihre Umgebung kontrolliert, aber zumindest für Aliase können Sie den Alias nicht aufrufen, indem Sie ein \
davor einfügen .
env
nicht auch als Funktion neu definiert. Das ist erschreckend. Ich dachte zuerst, dass Sonderzeichen helfen würden - Aufrufen mit vollem Pfad, einschließlich der /
Verwendung von .
to source und so weiter. Diese können aber auch für Funktionsnamen verwendet werden! Sie können jede gewünschte Funktion neu definieren, aber es ist schwierig, zum Aufrufen des ursprünglichen Befehls zurückzukehren.
#/bin/sh
wenn dies nicht die standardmäßige interaktive Shell ist.
env
Befehlenv -i <SCRIPT.sh>