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;
command-line
bash
shell
Alex Bender
quelle
quelle
Antworten:
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
extdebug
Option shopt ein .Aus dem Handbuch :
(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:
Wenn Ihre
xxx
Funktion nun einen Wert ungleich Null zurückgibt (z. B.1
), wird der Befehl des Benutzers nicht ausgeführt.Hier ist ein vollständiges Beispiel:
xxx
Überprüfen Sie in diesem Beispiel, ob das erste Wort des Befehls lautetsudo
. Wenn dies der Fall ist , wird eine Nachricht gedruckt, und der Befehl wird abgebrochen. Sie können den gesamten Benutzerbefehlxxx
mit eingeben"$*"
.quelle