2012-10-24 8 views
6

Sto scrivendo un wrapper bash per imparare alcuni concetti di scripting. L'idea è di scrivere uno script in bash e impostarlo come shell dell'utente al login.SIGINT per annullare la lettura in bash script?

Ho fatto un ciclo while che l'input read s e eval s dell'utente, e poi notato che, ogni volta che utente ha digitato CTRL + C, lo script interrotto così al termine della sessione utente.

Per evitare questo, ho intrappolato SIGINT, non facendo nulla nella trappola.

Ora, il problema è che quando si digita CTRL + C a metà di un comando, non viene annullato come si farebbe su bash: ignora semplicemente CTRL + C.

Quindi, se digito ping stockoverf^Cping stackoverflow.com, ottengo ping stockoverfping stackoverflow.com anziché il ping stackoverflow.com che volevo.

C'è un modo per farlo?

#!/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 

risposta

3

È possibile utilizzare uno strumento come xdotool per inviare Ctrl-A (inizio-of-line) Ctrl-K (delete-to-end-of-line) di ritorno (per la pulizia della linea)

#!/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 

Ma vi invito caldamente di RTFM ... Nella ricerca di '' parola chiave `` debug ...

man -Pless\ +/debug bash 
+0

xdotool farebbe il trucco, come un hack al 100%. Si ottiene un '^ C^A^K' e una linea vuota che non si mostra in puro bash (solo'^C'), ma è meglio di niente. Ad ogni modo, sarebbe fantastico non dipendere da 'xdotool', e per evitare quei marcatori extra - diciamo, fallo proprio come bash funziona. Ad ogni modo, non ho ricevuto l'invito RTFM ... Che cosa dovrebbe mostrare il debug? – mgarciaisaia

+0

Sì, questo è un enorme hack. Ma nello stato, questo fa il lavoro. Il modo giusto per seguire l'idea originale deve accedere ai descrittori di file tramite ioctl. –

+0

@mgarciaisaia Informazioni su cosa * debug * potrebbe fare e come potrebbe essere utilizzato. dai un'occhiata a [profiling bash in nanoseconds] (http://stackoverflow.com/a/20855353/1765658) –