Cosa significa una sequenza bash '\ 033 [999D' e dove viene spiegata?


19

Mi sono imbattuto in sequenze bash come \033[999De \033[2K\rche sono usate per manipolare una stampa su un terminale. Ma cosa significano queste sequenze? Dove posso trovare un elenco / riepilogo sul Web per aiutarmi a scoprire il significato di queste sequenze?


3
Queste sono sequenze terminali, non sequenze bash. È necessario consultare la documentazione del terminale per determinarne la funzione.
Chris Down,

1
Quelle sequenze servono per colorare l'output. Controllare: stackoverflow.com/questions/16845699/... e stackoverflow.com/questions/5947742/...
adizere

1
@adizere non tutte le sequenze di escape eseguono cambi di colore. Le sequenze in questa Q sono per la manipolazione della linea e il movimento del cursore, non per il colore.
Casey,

Risposte:


32

Vedi questo link http://www.termsys.demon.co.uk/vtansi.htm . Come dice Anthon, \033 è il codice ottale in stile C per un personaggio di fuga. La [999Dmuove il cursore 999 colonne, presumibilmente un modo forza bruta di ottenere all'inizio della linea. [2Kcancella la riga corrente. \rè un ritorno a capo che sposta il cursore all'inizio della riga corrente ed è una sequenza di escape di tipo C anziché una sequenza di controllo terminale.

Aggiornare

Come altri hanno sottolineato, queste sequenze di controllo non sono altro da fare bashse non il dispositivo terminale / emulatore su cui appare il testo. C'era una volta era comune che queste sequenze fossero interpretate da un hardware completamente diverso. Inizialmente, ognuno rispondeva a insiemi di codici completamente diversi. Per far fronte a questo, le librerie termcape erano terminfousate per scrivere codice compatibile con più terminali. Il tputcomando è un'interfaccia per la terminfolibreria ( termcapè anche possibile compilare il supporto) ed è un modo più affidabile per creare sequenze compatibili.

Detto questo, esiste anche lo standard ANSI X3.64 o ECMA-48 . Qualsiasi moderna implementazione del terminale utilizzerà questo. terminfoe termcapsono ancora pertinenti poiché l'implementazione può essere incompleta o includere estensioni non standard, tuttavia per la maggior parte degli scopi è lecito ritenere che le sequenze ANSI comuni funzioneranno.

Le xterm FAQ forniscono alcune informazioni interessanti sulle differenze tra i moderni emulatori di terminali (molti cercano solo di emularlo xterm) e in che modo le xtermsequenze si collegano ai terminali VT100 citati nel link sopra. Fornisce inoltre un elenco definitivo di xtermsequenze di controllo .

Anche comunemente usata è la console Linux, un elenco definitivo di sequenze di controllo per esso può essere trovato in man console_codes, insieme a un confronto a xterm.


Il link che hai incluso è solo la pagina che stavo cercando.
Alex,

@Alex Sono contento di averlo trovato da solo, la maggior parte delle pagine che ho visto sono solo colori di copertina e in qualche modo sono molto complessi da leggere. Questo lo definisce bello e semplice.
Graeme,

fai attenzione che l'azione dei codici di escape dipenda dal tipo di terminale (e puoi emulare diversi tipi di terminale su schermi / sistemi operativi moderni). Puoi usare tputinvece i comandi, per avere più portabilità, iirc (ma a scapito di una minore copertura delle specifiche del tuo terminale). VT100 (quello di cui parla la pagina) è supportato da molti (ma non tutto è supportato, credo ...). Ma la tua variabile TERM potrebbe essere impostata su qualche altro terminale, e questo potrebbe influenzare gli effetti di alcuni comandi
Olivier Dulac,

@Olivier, corretto tputè un modo più robusto. Ma è la compatibilità ANSI piuttosto che il terminale VT100 specifico che ora è abbastanza onnipresente, anche se immagino che sia possibile impostare xtermin una modalità che non li accetta. Aggiornerò con qualche informazione in più su questo credo.
Graeme,

@Olivier Anche molti emulatori di terminali sono impostati TERM=xtermsu ma non implementano tutto xterm.
Graeme,

5

Il \033è il carattere di escape, e quelli sequenza non sono specifici bash ma interpretati dal terminale (software o hardware (tramite rete o linea seriale)) in cui viene eseguito (bash) programma. Esistono molte sequenze del genere .

Ciò che ciascuno fa, dipende dal terminale per il quale dipende e potrebbe anche dipendere da qualsiasi sequenza precedente che modifica lo stato del terminale.

Questi sono spesso usati per impostare i colori nel prompt di bash , ma non ho trovato i tuoi esempi particolari su quella pagina.


3

'\ 033 [999D' è divertente. Alcuni terminali implementano meno sequenze di escape, quindi ciò potrebbe essere necessario se nessuno di '\ 033 [1G', '\ 033 [1; 1H', '\ 033 [1; 1f', o '\ r' si comportano come loro dovrebbe, ma chi utilizza una visualizzazione di testo a mille colonne? Queste sequenze hanno una pagina man in Linux: console_codes (4) . bjh21 ha un elenco dettagliato di tutti i codici . A seconda del programma che analizza '\ 033', potrebbe essere disponibile la sostituzione più chiara '\ e'.

In realtà non è previsto che vengano utilizzati direttamente - il modo corretto di emettere comandi di controllo del terminale è con un livello di astrazione come ncurses - ma funzionano altrettanto bene dai letterali di stringa.


Bene, ho appena pensato che \033[999Dsarebbe stato eseguito il backup sulle righe precedenti. Potrebbe essere solo il risultato di una codifica ingannevole;) Puoi anche bashinterpretare direttamente i codici di escape, ad es.$'\033[999D'
Graeme,

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.