2012-10-24 18 views
6

Piszę bash wrappera, aby poznać niektóre koncepcje skryptów. Chodzi o to, aby napisać skrypt w bashu i ustawić go jako powłokę użytkownika przy logowaniu.SIGINT, aby anulować czytanie w skrypcie Bash?

Wykonałem pętlę, wprowadzając dane użytkownika read i eval, a następnie zauważyłem, że po wpisaniu przez użytkownika CTRL + C skrypt został przerwany, aby sesja użytkownika została zakończona.

Aby tego uniknąć, uwięziłem SIGINT, nie robiąc nic w pułapce.

Problem polega na tym, że po wpisaniu nazwy CTRL + C w połowie polecenia nie zostanie ona anulowana, tak jak w przypadku bashu - po prostu ignoruje CTRL + C.

Tak więc, jeśli wpiszesz ping stockoverf^Cping stackoverflow.com, otrzymam ping stockoverfping stackoverflow.com zamiast ping stackoverflow.com, który chciałem.

Czy jest jakiś sposób to zrobić?

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

Odpowiedz

3

Można użyć narzędzia jak xdotool wysłać Ctrl-A (begin-of-line) Ctrl-K (delete-to-end-of-line) Powrót (do czyszczenia linii)

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

Ale gorąco zapraszam do RTFM ... W poszukiwaniu `` debug '' hasła ...

man -Pless\ +/debug bash 
+0

xdotool by rade, jako 100% hack. Otrzymasz '^ C^A^K' i pustą linię, która nie byłaby wyświetlana w czystej bash (tylko'^C'), ale jest lepsza niż nic. W każdym razie byłoby wspaniale nie polegać na 'xdotool' i unikać tych dodatkowych znaczników - powiedzmy, aby działał tak, jak działa bash. W każdym razie, nie otrzymałem zaproszenia rtfm ... Co powinienem pokazać debugowaniu? – mgarciaisaia

+0

Tak, to jest ogromny hack. Ale w stanie, to zadanie. Właściwy sposób postępowania zgodnie z pierwotnym pomysłem wymaga dostępu do deskryptorów plików za pośrednictwem ioctl. –

+0

@mgarciaisaia Informacje o tym, co * debug * może zrobić i jak można go użyć. spójrz na [bash profilujący w nanosekundach] (http://stackoverflow.com/a/20855353/1765658) –