Hier ist eine mögliche Lösung, die jedoch alle Befehle abfängt, nicht nur die, die über die Eingabeaufforderung eingegeben wurden (daher werden auch Befehle in Skripten abgefangen). Sie müssen es möglicherweise ändern, um das zu erhalten, was Sie möchten.
Stellen Sie zuerst die extdebugOption shopt ein .
Aus dem Handbuch :
Wenn festgelegt, ist das für Debugger vorgesehene Verhalten aktiviert:
1- Mit der Option -F für die integrierte Deklaration (siehe Bash Builtins) werden der Name der Quelldatei und die Zeilennummer für jeden Funktionsnamen angezeigt, der als Argument angegeben wird.
2- Wenn der von der DEBUG-Trap ausgeführte Befehl einen Wert ungleich Null zurückgibt, wird der nächste Befehl übersprungen und nicht ausgeführt.
3- Wenn der von der DEBUG-Trap ausgeführte Befehl den Wert 2 zurückgibt und die Shell in einer Unterroutine ausgeführt wird (eine Shell-Funktion oder ein Shell-Skript, das von der eingebauten. Oder source ausgeführt wird), wird ein Aufruf zur Rückgabe simuliert.
4- BASH_ARGC und BASH_ARGV werden wie in ihren Beschreibungen beschrieben aktualisiert (siehe Bash-Variablen).
5- Die Funktionsablaufverfolgung ist aktiviert: Die Befehlsersetzung, Shell-Funktionen und Subshells, die mit (command) aufgerufen werden, erben die Traps DEBUG und RETURN.
6- Die Fehlersuche ist aktiviert: Die Befehlsersetzung, die Shell-Funktionen und die mit (command) aufgerufenen Subshells erben die ERR-Trap.
(Hervorhebung von mir)
Sie benötigen diesen Befehl, um die Ausführung des vom Benutzer eingegebenen Befehls abzubrechen und stattdessen Ihre benutzerdefinierte Funktion aufzurufen. Wenn dies nicht festgelegt ist, ruft Bash Ihre benutzerdefinierte Funktion auf und führt den Befehl des Benutzers aus.
Verwenden Sie dann einfache Anführungszeichen, um Ihre Falle zu schreiben und die Bash-Variablenerweiterung zu verhindern:
trap 'caller >/dev/null || xxx $BASH_COMMAND' DEBUG
Wenn Ihre xxxFunktion nun einen Wert ungleich Null zurückgibt (z. B. 1), wird der Befehl des Benutzers nicht ausgeführt.
Hier ist ein vollständiges Beispiel:
$ shopt -s extdebug
$ xxx() { if [ "$1" = 'sudo' ]; then echo "No sudo, please.";return 1; fi }
$ trap 'caller >/dev/null || xxx $BASH_COMMAND' DEBUG
$ ls
foo bar
$ sudo ls
No sudo, please.
xxxÜberprüfen Sie in diesem Beispiel, ob das erste Wort des Befehls lautet sudo. Wenn dies der Fall ist , wird eine Nachricht gedruckt, und der Befehl wird abgebrochen. Sie können den gesamten Benutzerbefehl xxxmit eingeben "$*".