Que signifie une séquence bash '\ 033 [999D' et où est-elle expliquée?

19

J'ai rencontré des séquences bash telles que \033[999Det \033[2K\rqui sont utilisées pour effectuer des manipulations sur une impression sur un terminal. Mais que signifient ces séquences? Où puis-je trouver une liste / un résumé sur le Web pour m'aider à trouver la signification de ces séquences?

Alex
la source
3
Ce sont des séquences terminales, pas des séquences bash. Vous devez consulter la documentation de votre terminal pour déterminer leur fonction.
Chris Down
1
Ces séquences servent à coloriser la sortie. Vérifier: stackoverflow.com/questions/16845699/… et stackoverflow.com/questions/5947742/…
adizere
1
@adizere toutes les séquences d'échappement n'effectuent pas de changements de couleur. Les séquences de ce Q sont destinées à la manipulation des lignes et au déplacement du curseur, pas à la couleur.
casey

Réponses:

32

Voir ce lien http://www.termsys.demon.co.uk/vtansi.htm . Comme le dit Anthon, \033 est le code octal de style C pour un personnage d'échappement. Le fait [999Dreculer le curseur de 999 colonnes, vraisemblablement un moyen brutal d'arriver au début de la ligne. [2Kefface la ligne actuelle. \rest un retour chariot qui ramènera le curseur au début de la ligne en cours et est une séquence d'échappement de style C plutôt qu'une séquence de contrôle de terminal.

Mise à jour

Comme d'autres l'ont souligné, ces séquences de contrôle ne sont rien à faire bashelles - mêmes mais plutôt le terminal / émulateur sur lequel le texte apparaît. Il était une fois, ces séquences étaient interprétées par un matériel complètement différent. À l'origine, chacun répondrait à des ensembles de codes complètement différents. Pour faire face à cela , les termcapet les terminfobibliothèques où utilisés pour écrire du code compatible avec plusieurs terminaux. La tputcommande est une interface vers la terminfobibliothèque (le termcapsupport peut également être compilé) et est un moyen plus robuste de créer des séquences compatibles.

Cela dit, il existe également la norme ANSI X3.64 ou ECMA-48 . Toute implémentation de terminal moderne l'utilisera. terminfoet termcapsont toujours pertinentes car la mise en œuvre peut être incomplète ou inclure des extensions non standard, mais pour la plupart des cas, il est sûr de supposer que les séquences ANSI communes fonctionneront.

La xterm FAQ fournit des informations intéressantes sur les différences entre les émulateurs de terminaux modernes (beaucoup essaient juste de s'émuler xterm) et comment les xtermséquences se rapportent aux terminaux VT100 mentionnés dans le lien ci-dessus. Il fournit également une liste définitive des xtermséquences de contrôle .

Bien sûr, la console Linux est également couramment utilisée, une liste définitive des séquences de contrôle pour elle peut être trouvée dans man console_codes, ainsi qu'une comparaison avec xterm.

Graeme
la source
Le lien que vous avez inclus n'est que la page que je cherchais.
Alex
@Alex Glad Je l'ai trouvé moi-même, la plupart des pages que j'ai vues ne contiennent que des couleurs de couverture et sont en quelque sorte très complexes à lire. Cela le présente de façon simple et agréable.
Graeme
attention à ce que l'action des codes d'échappement dépende du type de terminal (et vous pouvez émuler plusieurs types de terminal sur des écrans / OS modernes). Vous pouvez utiliser des tputcommandes à la place, pour avoir plus de portabilité, iirc (mais au détriment d'une couverture moindre des spécificités de votre terminal). Le VT100 (celui dont parle la page) est supporté par beaucoup (mais tout n'est pas supporté, je crois ...). Mais votre variable TERM peut être définie sur un autre terminal, ce qui pourrait affecter les effets de certaines commandes
Olivier Dulac
@Olivier, correct tputest un moyen plus robuste. Mais c'est la compatibilité ANSI plutôt que le terminal VT100 spécifique qui est maintenant assez omniprésent, bien que j'imagine qu'il est possible de définir xtermun mode qui ne les accepte pas. Je vais mettre à jour avec plus d'informations à ce sujet, je pense.
Graeme
@Olivier De nombreux émulateurs de terminaux sont également configurés TERM=xtermpour, mais ne mettent pas tout en œuvre xterm.
Graeme
5

C'est \033le caractère d'échappement, et ces séquences ne sont pas spécifiques à bash mais interprétées par le terminal (logiciel ou matériel (via le réseau ou la ligne série)) dans lequel le programme (bash) s'exécute. Il existe de nombreuses séquences de ce type .

Ce que chacun fait dépend du terminal dont il dépend, et peut également dépendre de toute séquence précédente modifiant l'état du terminal.

Ceux-ci sont souvent utilisés pour définir les couleurs dans l'invite bash , mais je n'ai pas trouvé vos exemples particuliers sur cette page.

Anthon
la source
3

'\ 033 [999D' est drôle. Certains terminaux implémentent moins de séquences d'échappement, ce qui peut être nécessaire si aucun des paramètres \ \ 033 [1G ", \ \ 033 [1; 1H", "\ 033 [1; 1f" ou "\ r" se comporte comme ils devrait, mais qui utilise un affichage de texte de mille colonnes? Ces séquences ont une page de manuel sous Linux: console_codes (4) . bjh21 a une liste détaillée de tous les codes . Selon le programme qui analyse «\ 033», la substitution plus claire «\ e» peut être disponible.

Il n'est vraiment pas prévu que ceux-ci soient utilisés directement - la bonne façon d'émettre des commandes de contrôle de terminal est avec une couche d'abstraction telle que ncurses - mais ils fonctionnent tout aussi bien à partir des littéraux de chaîne.

user130144
la source
Bon point, j'ai juste supposé que \033[999Dcela sauvegarderait par rapport aux lignes précédentes. Peut être juste le résultat d'un codage douteux cependant;) Vous pouvez également bashinterpréter directement les codes d'échappement, par exemple$'\033[999D'
Graeme