Perché devo inserire 12 caratteri per cancellare questa riga di comando bash?


14

Apro un terminale xterm (80 colonne x 24 righe), quindi eseguo $ bash --norc --noprofilee quindi $ ttyper ottenere il nome del file del terminale: l'output è /dev/pts/9.

Da un altro terminale corro:

$ printf foo >/dev/pts/9

fooè stampato sulla riga di comando della shell nel primo terminale.
Se premo C-uper eseguire unix-line-discard(nome della funzione fornita da $ bind -P | grep -i c-u), foonon viene rimosso.
Se inserisco 11 spazi e premo C-u, gli spazi vengono rimossi ma non foo.
Se inserisco 12 spazi e premo C-u, anche gli spazi vengono rimossi foo.

inserisci qui la descrizione dell'immagine

Perché non riesco a rimuoverlo fooquando premo C-umentre il cursore si trova subito dopo di esso, e perché devo inserire 12 caratteri per rimuoverlo?


Ambiente:

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 16.04.6 LTS
Release:        16.04
Codename:       xenial

$ bash --version | head -n1
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)

$ xterm -version
XTerm(322)

Risposte:


19

Quando alcuni altri programma stampa fooalla /dev/pts/9comunicazione è tra i ttys, la shell non partecipare allo scambio, non può essere a conoscenza di quanti caratteri sono stati stampati o anche se ogni carattere è stato stampato. La shell crede ancora che non ci siano personaggi da cancellare. In effetti, se si stampa foosul terminale e si tenta di cancellarlo con backspace, non funziona. La shell non cerca di cancellare ciò che crede che non ci sia.

Prova nel terminale in cui hai usato il comando --norc --noprofile:

bash-4.3$ printf 'some text'

ottenere:

some textbash-4.3$

A quel punto il backspace non cancella nulla. Inoltre ctrl-unon cancellerà nulla. Se digiti alcuni caratteri (fino a 11 di essi) ctrl-urimuoverà solo ciò che è stato digitato (così come il backspace). Ma quando ci sono più di 11 caratteri, il comando ctrl-utornerà a ciò che ritiene sia l'inizio della riga (un modo più veloce per cancellare molti caratteri) che lascerà questo prompt:

some textb

Potrebbe essere considerato un bug IMO (ancora presente in bash 5.0). Ma cambia in 20 (18 per l'OP) caratteri in bash-5 se le --norc --noprofileopzioni non vengono utilizzate (non ho provato a trovare il motivo, non un problema così importante IMnshO).


Grazie per la risposta. Per quanto riguarda il secondo bug, con $ printf 'some text', posso riprodurre su bash 5.0 senza --norc --noprofileinserire 17 caratteri o più.
user938271

@ user938271 Corretto, il problema è stato riprodotto per me con 20 caratteri, informazioni aggiunte alla risposta, grazie.
Isaac,
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.