Ich schreibe einen Bash Wrapper, um einige Skriptkonzepte zu lernen. Die Idee ist, ein Skript in bash zu schreiben und es bei der Anmeldung als Shell eines Benutzers festzulegen.SIGINT, um eingelesenes Bash-Skript abzubrechen?
Ich machte eine while-Schleife, die read
s und eval
s Benutzereingabe, und dann bemerkte, dass, wenn Benutzer CTRL + C
eingegeben, das Skript abgebrochen, so dass die Benutzersitzung endet.
Um dies zu vermeiden, gefangen , nichts in der Falle zu tun.
Jetzt ist das Problem, dass, wenn Sie CTRL + C
um die Hälfte eines Befehls eingeben, wird es nicht abgebrochen, wie man es auf bash tun würde - es ignoriert einfach CTRL + C
.
Also, wenn ich ping stockoverf^Cping stackoverflow.com
eingeben, bekomme ich ping stockoverfping stackoverflow.com
anstelle der ping stackoverflow.com
, die ich wollte.
Gibt es eine Möglichkeit, das zu tun?
#!/bin/bash
# let's trap SIGINT (CTRL + C)
trap "" SIGINT
while true
do
read -e -p "$USER - SHIELD: `pwd`> " command
history -s $command
eval $command
done
xdotool würde den Trick tun, als 100% Hack. Du bekommst ein^C^A^K' und eine leere Zeile, die nicht in pure bash (nur '^ C') angezeigt wird, aber es ist besser als nichts. Wie auch immer, es wäre toll, nicht von "xdotool" abhängig zu sein, und diese zusätzlichen Marker zu vermeiden - sagen wir, es funktioniert wie Bash. Jedenfalls habe ich die rtfm-Einladung nicht bekommen ... Was sollte mir das Debuggen zeigen? – mgarciaisaia
Ja, das ist ein großer Hack. Aber im Staat, das macht den Job. Der richtige Weg, der ursprünglichen Idee zu folgen, muss über ioctl auf Dateideskriptoren zugreifen. –
@mgarciaisaia Über was * debug * könnte tun und wie es verwendet werden könnte. werfen Sie einen Blick auf [Profiling Bash in Nanosekunden] (http://stackoverflow.com/a/20855353/1765658) –