I simboli hash (#) trasformati in simboli cancelletto (£) dopo aver catturato un binario


42

Ecco come appariva il mio prompt di bash.

vecchio prompt di bash

Poi ho fatto qualcosa che probabilmente non era così intelligente, l'ho fatto cat /bin/bash. E ora il mio prompt di bash assomiglia a questo, con un simbolo di cancelletto (£) invece di un simbolo di hash (#). Influisce anche sui simboli hash all'interno dei file, vedi qui:

simboli di cancelletto nei file

Qualche idea su come ripristinarlo?

Modifica: questa domanda non chiede "Come modificare il mio prompt di bash?", Ma "Il mio prompt di bash è cambiato da solo, come posso ripristinarlo?"

Completo.bashrc per coloro che sono interessati.



1
(Mi sono preso la libertà di modificare un po 'il titolo per far emergere ciò che ha causato il problema. Modifica o ripristina come preferisci.)
ilkkachu

9
Il prompt, del file, ecc ancora contiene il codice carattere per #, \x23; è solo che il terminale ora interpreta \x23come £.
deltab,

4
La parte interessante è che "pound" è un altro nome per il simbolo di hash in inglese americano (e forse di altre nazionalità?) ... =)
jpmc26

1
In quale programma terminale è stato fatto questo?
SnoringFrog,

Risposte:


102

Il terminale accetta ed esegue un gruppo di diverse sequenze di caratteri come comandi di controllo. Ad esempio, tutto il movimento del cursore viene eseguito usando quelli. Alcuni dei codici apportano modifiche permanenti, come l'impostazione dei colori o il comando di utilizzare un set di caratteri alternativo al terminale. Gli eseguibili e altri file binari possono contenere byte che rappresentano quei comandi, quindi scaricare file binari sul terminale può avere effetti collaterali fastidiosi. Vedi ad esempio qui per alcuni dei codici di controllo.

Lo sfondo storico di ciò è che originariamente i terminali erano dispositivi piuttosto stupidi con uno schermo e una tastiera e si collegavano al computer reale tramite una porta seriale. Prima di allora, erano stampanti con tastiere. Non esisteva molto protocollo per separare i byte di dati dai byte di comando, quindi i comandi venivano dati al terminale "inline". (O meglio, i codici di escape e i caratteri di controllo erano il protocollo.) Si potrebbe presumere che se il sistema fosse stato concepito oggi, ci sarebbe una più chiara separazione tra dati e comandi.

Invece di chiudere semplicemente la finestra del terminale o uccidere l'emulatore, è possibile utilizzare il resetcomando , che invia un comando simile (o più) per ripristinare le impostazioni predefinite del terminale.

Non so che cosa esattamente farebbe sì che l'hash martellasse il cambiamento. (Ma lo fa @ Random832, vedi la loro risposta .) Ho più familiarità con il "set di caratteri alternativo", che può cambiare tutti i caratteri in glifi di disegno. Anche se ciò accade, l'input dalla tastiera di solito passa invariato, quindi la scrittura resetEnterfunziona anche se i caratteri vengono visualizzati come immondizia o per niente. (Rispetto alla richiesta di essere trasformato in un mucchio di righe, hai solo un effetto minore.)


1
Grazie per la spiegazione dettagliata. Voterò non appena avrò la reputazione necessaria.
Lhermann,

2
Quando ho provato cat /dev/urandomper la prima volta nella console di installazione di Debian (risoluzioni dello schermo che richiamano alla mente l'hardware in muratura), ho pensato di aver innescato un overflow e sono passato rapidamente al pulsante "abbandona tutte le modifiche, riavvia la macchina". Ora so che è una "funzionalità prevista".
wizzwizz4,

2
È una funzionalità storicamente intesa che non è desiderabile ora. Alcuni (tutti buoni) emulatori di terminali dovrebbero disabilitare le escape di set di caratteri legacy quando si esegue in un ambiente UTF-8, ma se lo fanno e come si attiva l'opzione per farlo se non è predefinito, è scarsamente documentato e varia.
R ..

78

Per la cronaca, per rispondere al perché ciò è accaduto e al modo in cui avrebbe potuto essere risolto senza chiudere il terminale (e se resetnon fosse riuscito):

Molti terminali supportano, come caratteristica dei terminali VT220 che stanno emulando, una serie di set di caratteri di sostituzione nazionali basati su ISO 646 e ISO 2022 . In particolare, è molto comune per qualche motivo, anche se gli altri non sono supportati, per loro supportare il set di caratteri britannico, che ha il simbolo della valuta sterlina nella stessa posizione in cui ASCII ha il segno numerico.

Quindi, quando hai stampato un file binario sul terminale, per qualche coincidenza ha prodotto la sequenza ESC ( A[o forse ESC ) Ae ^N] sul terminale. Questo può essere annullato manualmente stampando la sequenza che lo imposta allo stato normale:

printf '\e(B\e)0\x0f'

Ho indovinato qualcosa del genere, senza conoscere i dettagli. Grazie per la spiegazione. Che bello avere persone come te in giro!
Lhermann,

1
Oh, caro, i gabbiani al posto di Ä e Ö ... E Terminal su OS X supporta anche quella sostituzione, nel 2016. Se solo avessi un altro voto da dare.
ilkkachu,

@ilkkachu alcuni terminali che altrimenti li supportano (conosco Putty e penso anche la console Linux) li rifiutano quando UTF-8 è in uso, perché ISO 2022 afferma che altre sequenze (diverse da ESC % @) non devono essere supportate mentre sono nello stato che viene utilizzato per supportare UTF-8. Quindi potrebbero svanire alla fine poiché più applicazioni sono costrette a utilizzare UTF-8 per il disegno a tratteggio [che è l'uso effettivo più ampiamente usato di questa funzione, mentre gli altri set di caratteri sono per lo più inclusi perché è "gratuito" quando si implementa il meccanismo ].
Casuale 832

20
È facile ricordare queste sequenze di escape: "A" sta per British, "B" sta per "American": D
egmont

8
@egmont Ho scavato in questo, a quanto pare, sono assegnati in sequenza nell'ordine in cui sono stati registrati con l'ISO. La prima è la vecchia versione di riferimento internazionale [con ¤for $] è @, e poi la versione britannica è arrivata prima di quella americana. itscj.ipsj.or.jp/itscj_english/index.html per un elenco di tutti.
Casuale 832

30

Chiudi il terminale e aprine uno nuovo.


19
Non dovresti. La domanda è valida Forse qualcuno spiegherà perché questo è accaduto in dettaglio. Questo deve essere un buco in Bash. £si trova sotto la stessa chiave con #cui viene chiamato solo Alt. In qualche modo sono Altrimasti a Bash. Ad ogni modo, puoi attendere una spiegazione corretta o, se sei soddisfatto della mia risposta, fai clic sul segno di spunta per accettarla.
Tomasz,

1
O meglio non in Bash, ma nel programma terminale. Ho provato lo stesso su una riga di comando al di fuori della GUI e si esegue in loop per sempre.
Tomasz,

5
@Xalorous, la questione degli Stati che il problema è apparso quando catEd /bin/bashal terminale.
ilkkachu,

2
Random832 ha dato una buona spiegazione di ciò che è realmente accaduto
lhermann il

16
Questo è eccessivo: cosa succede se si dispone di uno stato nella sessione che si desidera mantenere? E se fosse una console anziché un terminale X? resetè lo strumento giusto per il lavoro.
pericynthion,


9

stty sanesembrava aver risolto il problema, come pure reset.


7

Non è necessario chiudere, riaprire o ripristinare il terminale! Anche se il ripristino funzionerà, questo non è il modo corretto!

Devi solo cancellare / cancellare il buffer di scrollback del terminale . Per fare ciò, basta usare il comando seguente:

$ echo -ne '\0033\0143'

1
Hai una spiegazione per questo miracolo?
Tomasz,

1
@tomas Sì amico di sicuro. quando -eè attivo man echo, riconoscerà alcune sequenze che puoi leggere eseguendo , una di queste è \0NNNche sta per byte con valore ottale NNN. In effetti, non è necessario ripristinare la sessione del terminale, è sufficiente cancellare il buffer di scorrimento. E il comando che ho detto farà il lavoro richiesto. Ad esempio, se si utilizza MacOS X, è presente una barra dei menu Modifica durante l'utilizzo del terminale e un'opzione come "Cancella scorrimento o ⌥⌘K".
FarazX,

5
La sequenza \033\143è ESC c, Ripristina allo stato iniziale : "Ripristina lo stato iniziale del VT100, ovvero lo stato che ha dopo l'accensione. Ciò provoca anche l'esecuzione dell'autotest all'accensione e il segnale INIT H a essere brevemente affermato ".
deltab,

1
@deltab Ho dimenticato di menzionare ESC, grazie un milione di amici.
FarazX,

1
@tomas Ogni volta che provi a visualizzare un file che non dovrebbe essere visualizzato - ad esempio file binari - il terminale si comporterà in modo strano e scomodo. Molti utenti Linux eseguono il ripristino, ma questa non è l'opzione migliore poiché non è necessario reimpostare la sessione terminale e cancellare tutto il buffer di scrollback.
FarazX,
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.