Ich versuche, GDB mit Erwartung zu automatisieren. Mein Skript startet gdb, führt eine Initialisierung durch und übergibt das Steuerelement an den Benutzer. Der interact
Befehl von Expect scheint das perfekte Werkzeug für diesen Job zu sein.
Betrachten Sie nun:
$ echo "spawn gdb
expect \"(gdb) \"
send \"help\r\"
expect \"(gdb) \"
interact" | expect -
Auf meinen Computern erzeugt dieses Scriptlet gdb und gibt erwartungsgemäß den Hilfebefehl aus. Aber dann verlässt es sofort das Skript und bringt mich zur Bash-Eingabeaufforderung zurück. Ich würde erwarten, dass der Benutzer innerhalb von gdb bleibt und Befehle ausgeben kann.
Irgendeine Idee, was mir hier fehlt?
Antworten:
interact
erhält seine Eingabe von derexpects
Standardeingabe, die die Pipe ist, dieecho
jetzt geschlossen wird.Sie können es stattdessen schreiben (ksh / zsh / bash-Syntax):
Das wird immer noch über eine Pipe gespeist, aber dieses Mal wird die Pipe als Pfadargument angegeben,
expect
damit erwartet wird, dass der Standard nicht beeinflusst wird.In diesem Fall wäre es jedoch naheliegend, Folgendes zu schreiben:
expect
likesh
und die meisten Shells erlauben das Übergeben von Inline-Skripten mit-c
.Wenn Sie die Ausgabe eines Befehls noch übergeben müssen (wie
echo
in Ihrem Fall), können Sie dies auch tun-c
mit:Dies bedeutet jedoch, dass im Gegensatz zu den Pipe-Ansätzen
expect
erst gestartet wird, wenn dieser Befehl beendet ist.Übrigens, hier könnten Sie
.gdbinit
stattdessen eine Datei oder eine-ix
Option verwendengdb
, die Sie nicht wirklich brauchenexpect
.quelle
expect <(cat <<- 'EOF' ... EOF )