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