Backspace non funziona con l'esecuzione di script bash


8

Sto eseguendo uno script molto semplice che legge riga per riga e stampa riga inserita nel terminale:

while read CMD; do
    echo $CMD
done

Funziona bene, ma quando sto cercando di modificare la linea con il backspacecarattere, stampa ^?invece di eliminare il carattere. E quando premo Ctrl+ backspacel'uscita è ^H. Come è possibile risolvere questo comportamento in modo da backspacerimuovere il carattere invece di aggiungere questi caratteri? Ho provato il stty erase '^?'comando ma non con successo.


Si noti che il 16.10 ha raggiunto la fine del suo ciclo di supporto il mese scorso. È necessario eseguire l'aggiornamento a 17.04 il più presto possibile.
Byte Commander

1
Suggerisco di sostituire read CMDcon read -e CMD.
Ciro,

1
prova terminatorinvece di gnome-terminal. Funziona come previsto
Severus Tux il

1
@whtyger ha funzionato per questo script. Nella mia situazione reale ho input dal programma, che non chiama read. Non ho l'opportunità di cambiare lo script del programma, questo era solo un esempio che rappresentava il mio problema. Esistono delle impostazioni globali in cui posso fare queste configurazioni per tutti gli input?
vrom911,

1
@Cyrus My Backspace funziona come voglio: elimina sempre l'ultimo carattere, anche per questo script dalla domanda senza -eopzione. Ma sulla macchina di @vrom911 non è il caso. Mi chiedo perché accada e dove questo può essere configurato.
Shersh,

Risposte:


6

Il problema è che ci sono molti modi per rappresentare un backspace, ma il readcomando non li capisce tutti. Dovresti essere in grado di configurare esattamente cosa viene inviato quando premi il ← Backspacetasto nelle impostazioni dell'emulatore di terminale.

Supponendo che stai utilizzando gnome-terminalcome emulatore, apri il menu Modifica e fai clic su Preferenze profilo . Passa alla scheda Compatibilità e dovresti ottenere queste opzioni:

gnome-terminal → preferenze profilo → compatibilità

Ora puoi cambiare il tasto Backspace genera: impostazione. Di seguito sono disponibili queste cinque opzioni tra cui scegliere. Ho aggiunto tra parentesi come si comportano sul mio sistema:

  • Automatico (funziona)
  • Control-H (stampa ^Hinvece)
  • ASCII DEL (impostazione predefinita, funziona)
  • Sequenza di escape (stampa ^[[3~invece)
  • TTY Erase (funziona)

Attualmente ho ASCII DEL. Ho provato tutte e 5 le opzioni, ma nessuna di esse ha risolto il problema.
vrom911,

Questo è strano. Puoi dirmi cosa type readdice e quali $SHELL --versionrapporti shell / versione ?
Byte Commander

So che è strano. Ho provato molto a google il mio problema, ma non ho trovato la soluzione adatta a me. type readdice read is a shell builtin. e $SHELL --versiondiceGNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
vrom911,

1

Ho avuto lo stesso problema, usando bash in Gnome-Terminal.

Si noti che sulla riga di comando, il backspace funziona come previsto, ma quando il mio programma (un semplice client di chat basato su socket TCP) legge dallo stdin, il backspacepersonaggio stampa (riecheggia sullo schermo) ^?invece di eliminare l'ultimo carattere.

Utilizzare # stty icanonper consentire la "modalità canonica (cotta)". Consulta alcune spiegazioni qui /unix/131105/how-to-read-over-4k-input-without-new-lines-on-a-terminal

Qualche ulteriore sfondo del mio problema / soluzione: ho avuto un problema in cui ho bisogno di incollare più di 4k caratteri. E durante quella ricerca, sono stato portato al link sopra. Ho usato # stty -icanonper disabilitare il limite di 4k, ma ho perso la capacità di usare backspace (cancella).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.