2012-10-24 11 views
6

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 

Antwort

3

Sie ein Tool wie xdotool verwenden könnte Strg-A zu senden (begin-of-line) Strg-K (delete-to-end-of-line) Return (Bereinigung der Linie)

#!/bin/bash 
trap "xdotool key Ctrl+A Ctrl+k Return" SIGINT; 
unset command 
while [ "$command" != "quit" ] ;do 
    eval $command 
    read -e -p "$USER - SHIELD: `pwd`> " command 
    done 
trap SIGINT 

Aber ich Ihnen dringend RTFM einladen ... Bei der Suche nach `` debug '' Schlüsselwort ...

man -Pless\ +/debug bash 
+0

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

+0

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. –

+0

@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) –