Symboles de hachage (#) transformés en symboles dièse (£) après avoir capturé un binaire


42

Voici à quoi ressemblait mon invite bash.

vieille invite bash

Ensuite, j'ai fait quelque chose qui n'était probablement pas aussi intelligent, je l'ai fait cat /bin/bash. Et maintenant, mon invite bash ressemble à ceci, avec un symbole dièse (£) au lieu d'un symbole dièse (#). Cela affecte même les symboles de hachage dans les fichiers, voir ici:

dièse dans les fichiers

Une idée comment inverser cela?

Edit: Cette question ne demande pas "Comment changer mon invite bash?", Mais "mon invite bash a changé par elle-même, comment puis-je le restaurer?"

Complet.bashrc pour ceux qui sont intéressés.



1
(J'ai pris la liberté de modifier un peu le titre pour évoquer la cause du problème. Modifiez-le ou revenez-en à votre guise.)
ilkkachu

9
L'invite, fichier , etc. contient toujours le code de caractère #, \x23; c'est juste que le terminal interprète maintenant \x23comme £.
Deltab

4
La partie intéressante est que "pound" est un autre nom pour le symbole de hachage en anglais américain (et peut-être d'autres nationalités?) ... =)
jpmc26

1
Dans quel programme terminal cela a-t-il été fait?
SnoringFrog

Réponses:


102

Le terminal accepte et exécute un ensemble de séquences de caractères différentes en tant que commandes de contrôle. Par exemple, tout mouvement du curseur est fait en utilisant ceux-ci. Certains codes apportent des modifications permanentes, telles que le paramétrage des couleurs ou l'indication du terminal sur l'utilisation d'un jeu de caractères différent. Les fichiers exécutables et autres fichiers binaires peuvent contenir des octets représentant ces commandes. Par conséquent, le transfert de fichiers binaires sur le terminal peut avoir des effets secondaires gênants. Voir par exemple ici quelques codes de contrôle.

L’historique de cette situation est qu’à l’origine, les terminaux étaient des appareils plutôt stupides dotés d’un écran et d’un clavier , et se connectaient à l’ordinateur via un port série. Avant cela, c'étaient des imprimantes à clavier. Il n'y avait pas beaucoup de protocole pour séparer les octets de données des octets de commande, les commandes ont donc été données au terminal "inline". (Ou plutôt, les codes d'échappement et les caractères de contrôle étaient le protocole.) On pourrait supposer que si le système était conçu aujourd'hui, la séparation entre les données et les commandes serait plus claire.

Au lieu de simplement fermer la fenêtre du terminal ou de tuer l’émulateur, vous pouvez utiliser la resetcommande , qui envoie une commande similaire (ou plusieurs) pour réinitialiser le terminal à nouveau par défaut.

Je ne sais pas ce qui provoquerait le changement de livre. (Mais @ Random832 le voit , voir sa réponse .) Je suis plus familier avec le "jeu de caractères alternatif", qui peut transformer tous les caractères en glyphes de dessin au trait. Même si cela se produit, la saisie au clavier est généralement inchangée. L'écriture resetEnterfonctionne donc même si les caractères s'affichent comme des ordures ou pas du tout. (Par rapport à votre invite transformée en un tas de lignes, vous avez seulement un effet mineur.)


1
Merci pour l'explication détaillée. Je voterai dès que j'aurai la réputation nécessaire.
lhermann

2
Lorsque j’ai essayé cat /dev/urandompour la première fois dans la console d’installation Debian (résolutions d’écran qui rappellent le matériel maçonné), je pensais avoir déclenché un débordement et avoir rapidement navigué jusqu’au bouton "Abandonner toutes les modifications, redémarrer la machine". Maintenant, je sais que c'est une "fonctionnalité voulue".
wizzwizz4

2
C'est une caractéristique historiquement prévue qui n'est pas souhaitable maintenant. Certains (tous les bons) émulateurs de terminal devraient désactiver les échappements hérités de jeu de caractères lorsqu’ils sont exécutés dans un environnement UTF-8, mais qu’ils le fassent et que vous activiez l’option de le faire si ce n’est pas le cas par défaut, elle est mal documentée et varie
R ..

78

Pour mémoire, pour expliquer pourquoi cela s'est passé et comment cela aurait pu être corrigé sans fermer le terminal (et en cas d' resetéchec):

De nombreux terminaux prennent en charge, en tant que caractéristique des terminaux VT220 qu'ils émulent, un certain nombre de jeux de caractères de remplacement nationaux basés sur ISO 646 et ISO 2022 . En particulier, il est très courant pour une raison quelconque, même si les autres ne sont pas prises en charge, de prendre en charge le jeu de caractères britannique, qui a le symbole monétaire pound à la même position où ASCII a le signe du numéro.

Ainsi, lorsque vous imprimez un fichier binaire sur le terminal, celui-ci envoie la séquence ESC ( A[ou peut ESC ) A- être et ^N] au terminal. Cela peut être annulé manuellement en imprimant la séquence qui la met à l'état normal:

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

J'ai deviné quelque chose comme ça, sans connaître les détails. Merci pour l'explication. C'est génial d'avoir des gens comme vous autour de vous!
lhermann

1
Oh mon Dieu, les mouettes à la place de Ä et Ö ... Et Terminal sous OS X prend même en charge ce remplacement, en 2016. Si seulement j'avais un autre vote positif à donner.
ilkkachu

@ilkkachu, certains terminaux qui les prennent en charge (je connais Putty, ainsi que la console Linux) les rejettent lorsque UTF-8 est utilisé, car ISO 2022 indique que d'autres séquences (autres que ESC % @) ne seront pas prises en charge tant qu'elles sont en état. qui est utilisé pour supporter UTF-8. Ils risquent donc de disparaître à la fin, car de plus en plus d'applications sont obligées d'utiliser UTF-8 pour le dessin de lignes [l'utilisation réelle la plus largement utilisée de cette fonctionnalité, les autres jeux de caractères étant pour la plupart inclus car il est "gratuit" lorsque le mécanisme est implémenté. ].
Random832

20
Il est facile de se souvenir de ces séquences d'échappement: "A" signifie "britannique", "B" signifie "américain": D
egmont

8
@egmont J'y ai plongé, il s'est avéré qu'ils sont assignés de manière séquentielle dans l'ordre dans lequel ils ont été enregistrés auprès de l'ISO. La première est l'ancienne version de référence internationale [with ¤for $] est @, puis la version britannique est arrivée avant la version américaine. itscj.ipsj.or.jp/itscj_english/index.html pour une liste complète.
Random832

30

Fermez le terminal et ouvrez-en un nouveau.


19
Tu ne devrais pas. La question est valide. Peut-être que quelqu'un va expliquer pourquoi cela est arrivé en détail. Ce doit être un trou dans Bash. £se trouve sous la même clé car #il est appelé avec Alt. En quelque sorte le Altrestés à Bash. Quoi qu'il en soit, vous pouvez attendre une explication appropriée ou, si vous êtes satisfait de ma réponse, cliquez sur le chèque pour l'accepter.
Tomasz

1
Ou plutôt pas dans Bash, mais dans le programme terminal. J'ai essayé la même chose sur une ligne de commande en dehors de l'interface graphique et il tourne en boucle pour toujours.
Tomasz

5
@Xalorous, les états question que le problème est apparu quand il cated /bin/bashau terminal.
Ilkkachu

2
Random832 a donné une bonne explication de ce qui s'est réellement passé
lhermann

16
C'est exagéré - que se passe-t-il si vous souhaitez conserver un état de votre session? Et si c'est une console plutôt qu'un terminal X? resetest le bon outil pour le travail.
pericynthion


9

stty sanesemblait résoudre le problème aussi bien que reset.


7

Il n'est pas nécessaire de fermer, ré-ouvrir ou de réinitialiser votre terminal! Bien que la remise en service fonctionne, ce n'est pas la bonne façon!

Il vous suffit d'effacer / effacer la mémoire tampon de défilement de votre terminal . Pour ce faire, utilisez simplement la commande ci-dessous:

$ echo -ne '\0033\0143'

1
Avez-vous une explication pour ce miracle?
Tomasz

1
@ tomas Oui mate à coup sûr. Quand -eest en vigueur, il reconnaîtra certaines séquences qui peuvent être lues en cours d'exécution man echo, l'une d'elles étant \0NNNce qui signifie octet avec valeur octale NNN. En fait, vous n'avez pas besoin de réinitialiser votre session de terminal, il vous suffit d'effacer votre tampon de défilement. Et la commande que j'ai dite fera le travail requis. Par exemple, si vous utilisez MacOS X, il y a une barre de menu Edition dans le terminal, et l'option "Effacer le défilement ou ⌥⌘K".
FarazX

5
La séquence \033\143est ESC c, Reset to Initial State : "Réinitialise le VT100 à son état initial, c'est-à-dire l'état qu'il a après sa mise sous tension. Ceci provoque également l'exécution de l'autotest de mise sous tension et le signal INIT H être affirmé brièvement. "
Deltab

1
@deltab J'ai oublié de parler de l'ESC, merci un million de fois.
FarazX

1
@tomas Chaque fois que vous essayez d'afficher un fichier qui n'est pas censé être affiché - par exemple des fichiers binaires - le terminal agira de manière étrange et maladroite. De nombreux utilisateurs de Linux effectuent la réinitialisation, mais ce n'est pas la meilleure option, car il n'est pas nécessaire de réinitialiser la session de terminal. Il est également nécessaire d'effacer la mémoire tampon de défilement.
FarazX
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.