Bash Preexecute

1

Ich versuche, einen Bash-Befehls-Wrapper zu schreiben, bei dem es sich um den aktuellen Patch-Bash-Befehl handelt. Aber ich stehe vor dem Problem. Da ich kein guter Shell-Benutzer bin, kann ich keinen richtigen Ausdruck für die Variablenzuweisung in Zeichenfolge schreiben. Siehe unten:

Ich habe die Falle gestellt, um Folgendes auszuführen:

 alex@bender:~$ trap "caller >/dev/null ||  xxx \"\${BASH_COMMAND}"\"  DEBUG;

Ich möchte die Variable BASH_COMMAND ändern , mache so etwas wie BASH_COMMAND =, xxx ${BASH_COMMAND}aber ich weiß nicht, wie ich Variablen in dieser Zeichenfolge entkommen muss

HINWEIS: xxx - meine benutzerdefinierte Funktion, die einen Wert zurückgeben muss, wenn sich am Ende des Befehls das Wort teststr befindet

function xxx(){
# find by grep, if teststr in the end
`echo "$1" | grep "teststr$" >/dev/null`;
# if true ==> do
if [ "$?" == "0" ]; then
    # cut last 6 chars (len('teststr')==6)
    var=`echo "$1" | sed 's/......$//'`;
    echo "$var";
fi    }

Wie kann ich das Zeug machen ?:

alex@bender:~$ trap "caller >/dev/null || ${BASH_COMMAND}=`xxx $BASH_COMMAND`"  DEBUG;
Alex Bender
quelle
Ich glaube nicht, dass es möglich ist, die Bash-Eingabe auf diese Weise zu ändern. Möglicherweise können Sie dies jedoch mit einem Readline-Hook tun. Es wäre hilfreich zu wissen, was genau Sie erreichen möchten, da es durchaus einen anderen Weg geben könnte.
rici

Antworten:

2

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 "$*".

bfontaine
quelle