Хеш-символы (#) превратились в фунт-символы (£) после загрузки двоичного кода


42

Так выглядело мое приглашение bash.

старая подсказка bash

Затем я сделал что-то, что, вероятно, было не так умно, как я cat /bin/bash. И теперь моя подсказка bash выглядит следующим образом: с символом фунта (£) вместо символа хеша (#). Это даже влияет на хеш-символы в файлах, смотрите здесь:

символы фунта в файлах

Любая идея, как отменить это?

Изменить: Этот вопрос не спрашивает «Как изменить мою подсказку bash?», Но «моя подсказка bash изменилась сама собой, как я могу восстановить ее?»

Полный.bashrc для тех, кто заинтересован.



1
(Я позволил себе немного отредактировать заголовок, чтобы
вспомнить,

9
Стремительный, файл и т.д. все еще содержит код символа для #, \x23; просто терминал теперь интерпретирует \x23как £.
deltab

4
Интересная часть заключается в том, что «фунт» - это еще одно название хэш-символа в американском (и, возможно, в других национальностях?) Английском ... =)
jpmc26

1
В какой терминальной программе это было сделано?
SnoringFrog

Ответы:


102

Терминал принимает и выполняет набор различных последовательностей символов в качестве команд управления. Например, все движения курсора выполняются с использованием тех. Некоторые коды вносят постоянные изменения, такие как установка цветов или указание терминалу использовать альтернативный набор символов. Исполняемые файлы и другие двоичные файлы могут содержать байты, представляющие эти команды, поэтому выгрузка двоичных файлов в терминал может иметь неприятные побочные эффекты. Смотрите, например, здесь некоторые коды управления.

Исторический фон этого заключается в том, что изначально терминалы были довольно тупыми устройствами с экраном и клавиатурой , и они подключались к реальному компьютеру через последовательный порт. До этого это были принтеры с клавиатурой. Для отделения байтов данных от командных байтов не было большого количества протоколов, поэтому команды передавались терминалу «inline». (Или, скорее, управляющие коды и управляющие символы были протоколом.) Можно предположить, что если бы система была разработана сегодня, было бы более четкое разделение между данными и командами.

Вместо того, чтобы просто закрывать окно терминала или убивать эмулятор, вы можете использовать resetкоманду , которая отправляет аналогичную (или несколько) команду для сброса терминала до нормальных значений по умолчанию.

Я не знаю, что именно приведет к изменению хеша. (Но @ Random832 делает, смотрите их ответ .) Я более знаком с "альтернативным набором символов", который может превратить все символы в глифы рисования линий. Даже если это произойдет, ввод с клавиатуры обычно проходит без изменений, поэтому запись по- resetEnterпрежнему работает, даже если символы отображаются как мусор или не отображаются вообще. (По сравнению с вашим приглашением, превращенным в кучу строк, вы получили только незначительный эффект.)


1
Спасибо за подробное объяснение. Я буду голосовать, как только у меня будет необходимая репутация.
Лерманн

2
Когда я впервые попробовал cat /dev/urandomв консоли установки Debian (разрешения экрана, которые напоминают о кирпичном оборудовании), я подумал, что вызвал переполнение, и быстро перешел к кнопке «отменить все изменения, перезагрузить компьютер». Теперь я знаю, что это «предназначенная функция».
wizzwizz4

2
Это исторически задуманная особенность, которая сейчас нежелательна. Некоторые (все хорошие) эмуляторы терминалов должны отключать экранирование устаревших наборов символов при работе в среде UTF-8, но если они это делают, и как вы активируете опцию, чтобы сделать это, если это не по умолчанию, плохо документированы и меняется.
R ..

78

Для записи, чтобы ответить, почему это произошло и как это можно было исправить, не закрывая терминал (и если это resetне удалось):

Многие терминалы поддерживают, как особенность эмулируемых терминалов VT220 , ряд национальных заменяющих наборов символов на основе ISO 646 и ISO 2022 . В частности, по некоторым причинам очень часто, даже если другие не поддерживаются, они поддерживают британский набор символов, в котором символ валюты фунта находится в той же позиции, где ASCII имеет знак числа.

Таким образом, когда вы печатаете двоичный файл в терминал, он по некоторому совпадению выводит последовательность ESC ( A[или, возможно, ESC ) Aи ^N] в терминал. Это можно отменить вручную, напечатав последовательность, которая устанавливает его в нормальное состояние:

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

Я угадал что-то подобное, не зная подробностей. Спасибо за объяснение. Как здорово, что вокруг тебя такие люди!
Лерманн

1
О, дорогие, чайки вместо Ä и Ö ... И Терминал на OS X даже поддерживает эту замену в 2016 году. Если бы у меня был еще один отзыв.
ilkkachu

@ilkkachu некоторые терминалы, которые в противном случае поддерживают их (я знаю Putty, и я думаю также консоль Linux), отклоняют их, когда используется UTF-8, потому что ISO 2022 говорит, что другие последовательности (кроме ESC % @) не должны поддерживаться в состоянии это используется для поддержки UTF-8. Таким образом, они могут со временем исчезнуть, так как все больше приложений вынуждены использовать UTF-8 для рисования линий [что является наиболее широко используемым фактическим использованием этой функции, остальные наборы символов в основном включены, потому что это «бесплатно», когда у вас реализован механизм ].
Random832

20
Легко запомнить эти escape-последовательности: «A» означает «британец», «B» означает «американец»: D
egmont

8
@egmont Я углубился в это, как оказалось, они назначаются последовательно в порядке их регистрации в ISO. Первый старый международный эталонный вариант [с ¤для $] является @, а затем британская версия случилось попасть в перед американской. itscj.ipsj.or.jp/itscj_english/index.html для получения списка всех из них.
Random832

30

Закройте терминал и откройте новый.


19
Ты не должен. Вопрос действителен. Может быть, кто-то объяснит, почему это произошло в деталях. Это должно быть дыра в Баш. £сидит под тем же ключом, что и #только он называется Alt. Каким-то образом Altостался в Баш. В любом случае, вы можете дождаться правильного объяснения или, если вы удовлетворены моим ответом, нажмите на чек, чтобы принять его.
Томас

1
Вернее не в Bash, а в терминальной программе. Я попробовал то же самое в командной строке за пределами графического интерфейса, и он зацикливается навсегда.
Томас

5
@Xalorous, вопрос гласит , что проблема возникла , когда он catэд /bin/bashк терминалу.
ilkkachu

2
Random832 дал хорошее объяснение того, что на самом деле произошло
lhermann

16
Это излишне - что если в вашем сеансе есть состояние, которое вы хотите сохранить? Что если это консоль, а не терминал X? resetэто правильный инструмент для работы.
перицинтион


9

stty saneказалось, решил проблему так же, как и resetсделал.


7

Нет необходимости закрывать и повторно открывать или сбрасывать свой терминал! Хотя сброс будет работать, это не правильный путь!

Вам просто нужно очистить / стереть ваш буфер обратной прокрутки терминала . Для этого просто используйте команду ниже:

$ echo -ne '\0033\0143'

1
У вас есть объяснение этому чуду?
Томаш,

1
@tomas Да, приятель, конечно. когда -eон активен, он распознает некоторые последовательности, о которых вы можете прочитать, запустив man echo, одна из которых - \0NNNэто байт с восьмеричным значением NNN. На самом деле вам не нужно СБРОСИТЬ сеанс терминала, вам просто нужно ОЧИСТИТЬ свой буфер обратной прокрутки. И команда, которую я сказал, сделает необходимую работу. Например, если вы используете MacOS X, во время использования терминала есть строка «Изменить» в строке меню, и есть опция «Очистить прокрутку или ⌥⌘K».
FarazX

5
Последовательность \033\143: ESC c, Reset to Initial State : «Сбросить VT100 в его начальное состояние, то есть в состояние, в котором он находится после включения питания. Это также вызывает выполнение самотестирования при включении питания и подачи сигнала INIT H на быть утвержденным кратко.
deltab

1
@deltab Я забыл упомянуть об ESC, спасибо за дружбу.
FarazX

1
@tomas Всякий раз, когда вы пытаетесь отобразить файл, который не должен отображаться - например, двоичные файлы - терминал будет действовать странно и неудобно. Многие пользователи Linux делают сброс, но это не лучший вариант, так как нет необходимости сбрасывать сеанс терминала, а очистка буфера обратной прокрутки необходима.
FarazX
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.