C'è qualche motivo per cui ottengo ^ [[A quando premo la freccia su nella schermata di accesso della console?


32

Ogni volta che accedo alla console, premo upintenzionalmente la freccia per visualizzare i comandi precedentemente digitati. Ma vedo questo ^[[A.

Ma quando premo i Ctrl Alt Print Screen Scroll Lock Pause Break Page Up Page Down Wintasti non fa eco a nessun personaggio.

Quale potrebbe essere il motivo dietro?

Una ^[[Aspecie di personaggio implica qualcosa?

inserisci qui la descrizione dell'immagine

Risposte:


20

Questo è il modo in cui il terminale rappresenta il codice chiave grezzo del tasto Su inviatogli dalla tastiera. Fondamentalmente, la shell normalmente intercettava la pressione dei tasti, ma non c'è nulla da fare al prompt di accesso. Quindi il personaggio che hai digitato viene stampato sulla console proprio come qualsiasi altra lettera (o numero o qualsiasi altra cosa).


3
@RubanSavvy Ctrl, Alt e Win (spesso chiamati Super nel mondo GNU / Linux) sono modificatori. Se li premi e un tasto, vedrai qualcosa di diverso stampato sullo schermo. Sospetto che Scroll Lock sia interpretato dal kernel o qualcos'altro di basso livello, per il controllo di tty, anche se non ne sono sicuro. Le pagine su e giù sono probabilmente ingoiate da gettyo login, anche se non sono sicuro del perché. Immaginazione istruita dice che lo schermo di stampa è interpretato appositamente dal kernel per ragioni storiche. Non sono sicuro al 100% su nessuno, tranne i modificatori.
strugee,

3
quanto sopra dovrebbe probabilmente essere modificato nella risposta.
strugee,


19

Le tastiere inviano eventi al computer. Un evento dice "scan code nnn down" o "scan code nnn up". All'altra estremità della catena, le applicazioni in esecuzione in un terminale si aspettano input sotto forma di una sequenza di caratteri. (A meno che non abbiano richiesto l'accesso non elaborato, come fa il server X.) Quando si preme A, la tastiera invia l'informazione "scan code 38 down". Il driver della console cerca la mappa dei tasti e la trasforma in "carattere a" (se non viene premuto alcun tasto modificatore).

Quando si preme un tasto o una combinazione di tasti che non genera un carattere, le informazioni devono essere codificate in termini di caratteri. Alcune chiavi e combinazioni di tasti hanno caratteri di controllo corrispondenti, ad es. Ctrl+ AInvia il carattere (valore byte 1), Returninvia il carattere (Ctrl + M, valore byte 13), ecc. La maggior parte dei tasti funzione non ha un carattere corrispondente e invece invia una sequenza di caratteri che inizia con il carattere (escape, valore byte 27). Ad esempio, la chiave Upviene tradotta nella sequenza di escape ␛[A(tre caratteri: escape, parentesi aperta, maiuscola A).

Il prompt dei nomi utente sulla console è stupido e non comprende la maggior parte delle sequenze di escape. Non ha le funzionalità di edizione della linea e cronologia a cui sei abituato: sono fornite dalla shell e fino a quando non accedi non hai una shell. Quindi visualizza semplicemente la sequenza di escape. Non esiste un glifo per il personaggio, quindi viene visualizzato come ^[. Il ^segno è tradizionalmente usato come prefisso per i caratteri di controllo e escape è ^[dovuto al suo valore di byte: è il valore di byte di [, meno 64.

Se si preme Upal prompt della shell, questo invia la stessa sequenza di 3 caratteri alla shell. La shell lo interpreta come una sequenza di comandi (in genere per richiamare l'elemento della cronologia precedente). Se si preme Ctrl+ Vquindi Upal prompt della shell, questo inserisce la sequenza di escape al prompt: Ctrl+ Vè un comando per inserire il carattere successivo letteralmente invece di interpretarlo come comando, quindi il carattere non viene interpretato come l'inizio di una sequenza di escape .

Alcuni tasti sono solo modificatori e non vengono trasmessi ad applicazioni terminali. Ad esempio, quando si preme Shift, queste informazioni rimangono nel driver del terminale e vengono prese in considerazione se si preme A, quindi il driver invia Aall'applicazione anziché a.

Inoltre, alcuni tasti funzione potrebbero non essere mappati nella tua console.

Per una vista simile nella GUI, vedi Qual è la meta chiave di bash?


Questa è un'ottima risposta, grazie Gilles come sempre.
JoshuaRLi,

5

Non si tratta di come i tasti sono rappresentati dal "terminale" (cioè dall'applicazione dell'emulatore di terminale). Quello che vedi è il codice ANSI ( sequenza di escape ANSI ) per spostarti verso l'alto di una riga, ma tradotto in forma stampabile.

  1. L'hardware della tastiera invia "codici di scansione", ma vengono tradotti e presentati alle applicazioni a livello di comando come caratteri. La chiave Adiventa un singolo byte: Ase il tasto MAIUSC è premuto (o Shift Lock), aaltrimenti.

  2. In un terminale ANSI-compliant, i tasti freccia non inviano un singolo carattere (non ci sono codici per frecce in un set di caratteri ASCII), ma a 3 carattere "sequenza di escape": escape-[-A. Gli altri tre tasti freccia sono escape-[-B, C, D.

  3. La stessa sequenza di caratteri sposta il cursore in alto di una riga se inviato (riecheggiato) a un vecchio terminale ANSI fisico. Molti programmi, inclusi gli emulatori di terminale, riconoscono queste sequenze di caratteri e fanno qualcosa di appropriato: gli emulatori di terminale sposteranno il cursore verso l'alto (in questo modo la curseslibreria sposta il cursore), ma bashlo intercettano e scorreranno invece la cronologia.

  4. Per evitare che il cursore finisca dappertutto nei programmi che non servono a spostare il cursore sullo schermo, vedrai spesso ESC nell'input da tastiera visualizzato come sequenza stampabile ^[(perché escape corrisponde a control-[). Questo è effettivamente gestito dall'interfaccia del dispositivo terminale; vedi stty(1). Di conseguenza, la freccia su verrà visualizzata come ^[[A. Lo vedrai dalla riga di comando se digiti cat, premi Invio e premi alcuni tasti freccia. Questo è anche quello che hai visto nella schermata di accesso della console.

Infine: Control, Alt, e gli altri tasti che hai citato non mappare sequenze di caratteri. Influiscono sul carattere inviato da un altro tasto (come nell'esempio a/ Asopra) o semplicemente non hanno alcuna mappatura sul testo. Tali pressioni dei tasti possono essere rilevate solo dai programmi che ascoltano gli eventi della tastiera. Non possono essere visti leggendo da input standard (o essere scritti in un file).


3

Questo comportamento è diverso da shell a shell. La maggior parte delle shell utilizza una libreria chiamata readlineper modificare le righe nel prompt. Ecco un riferimento di comando completo per questa libreria, quindi quando un'applicazione è in uso readlinepuoi modificare e navigare tra le righe con questi comandi.

I tasti freccia verticali sono configurati in readline per navigare nella cronologia dei comandi. E nel promt di login non c'è cronologia dei comandi. Ecco perché i personaggi ^[[Ae ^[[Bsono stampati sullo schermo. Quindi cosa ^[[Asignifica?

La pagina di manuale di bash dice sotto PROMPTING:

\[     begin a sequence of non-printing characters, which could be used to embed
       a terminal control sequence into the prompt

Le sequenze di escape per i tasti freccia in ANSI sono:

  • [ValueACursore su (dove Valuepuò essere vuoto)

  • [ValueBCursore verso il basso (dove Valuepuò essere vuoto)


5
La tua risposta riguarda cose diverse, perché il prompt di accesso viene stampato e gestito da login, a cui non è correlato bash.
Risto Salminen,

1
bashe loginstanno usando la stessa libreria (readline) per modificare le righe. La differenza è che loginnon interpretare i tasti freccia verticali come un comando, come bashfa.
caos

Sì, lo ammetto.
Risto Salminen,

La sintassi bash dovrebbe apparire come la ^[rappresentazione di escape, ma sono cose diverse. Bash avrebbe potuto usare qualsiasi sintassi. In realtà, quando si scrive \[A, bash emette tre personaggi: ^[(cioè di fuga), [, A.
alexis l'

0

Questi sono codici di escape ANSI . ^[è la notazione utilizzata dalla shell per visualizzare un ESCbyte (ASCII byte 27). Quindi il tuo esempio è un byte ESC seguito dal testo [A. Come puoi vedere nell'articolo di Wikipedia, ^[[( ESCseguito da [) è un introduttore di sequenza di controllo o CSI. CSI Asignifica spostare il cursore verso l'alto di una colonna.

Se vuoi vedere un codice di escape nel terminale, digita CTRL + V e poi un'altra sequenza di tasti. Ad esempio, CTRL + V seguito dalla freccia su mostra ^[[A.


0

La shell dei comandi, ad esempio Bash, è il programma che traduce la freccia in su nell'azione "recupera comando precedente". Non hai una shell dei comandi in esecuzione.


0

TLDR

Probabilmente stai eseguendo quello shche genera i codici chiave grezzi generati quando premi il tasto freccia Su.

Una shell più avanzata come bashintercetta questi codici chiave e fa qualcosa con loro. Ad esempio, mostra l'ultimo comando nella sua storia.

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.