2016-04-24 22 views
5

Ho uno script che legge una riga da stdin ed esegue alcune operazioni in base ai contenuti della riga. Ho bisogno di associare una chiave a quello script in modo che possa essere chiamato semplicemente digitando Ctrl-t. Quando chiamo lo script con il suo nome funziona come previsto, ma quando premo il tasto si blocca. In effetti la shell si blocca e devo ucciderlo. Lo script utilizza read -r line. Ho provato con cat con gli stessi risultati.Bind un tasto per il comando che legge stdin

Script assomiglia a questo (nome read.sh file):

#!/bin/bash 

echo -n ' > ' 
read -r buf 
echo "you typed $buf" 

Bind in questo modo:

bind -x '"\C-t" : "read.sh"' 
+0

Puoi pubblicare esattamente ciò che hai provato? – andlrc

risposta

2

le impostazioni del terminale sono diverse quando si preme Ctrl +t contro quando si avvia lo script attraverso il terminale. Se si aggiunge la seguente riga read.sh, sarà stampare le impostazioni del terminale:

echo Terminal settings: "$(stty -a)" 

Ora eseguire lo script di per sé, e quindi eseguire premendo Ctrl + t. Noterai alcune differenze, la più grande delle quali è l'aggiunta di -echo e -icrnl, che disattiva echo e modifica la gestione di nuova riga. Questo dà l'impressione di appendere lo script.

È possibile risolvere questo problema all'interno dello script forzando il tty in modalità canonica e aggiungendo di nuovo eco. Prima di apportare modifiche stty, vorrai salvare le impostazioni e ripristinarle quando lo script termina. È possibile utilizzare trap per quello.

#!/bin/bash 
# Save the tty settings and restore them on exit. 
SAVED_TERM_SETTINGS="$(stty -g)" 
trap "stty \"${SAVED_TERM_SETTINGS}\"" EXIT 

# Force the tty (back) into canonical line-reading mode. 
stty cooked echo 

# Read lines and do stuff. 
echo -n ' > ' 
read -r buf 
echo "you typed $buf" 
+0

Ottima risposta. Grazie! –

Problemi correlati