Символи хешу (#) перетворилися на символи фунта (£) після введення бінарного файлу


42

Так виглядав мій баш-підказки.

стара баш-підказка

Тоді я зробив щось, що, мабуть, не так розумно, я це зробив cat /bin/bash. І тепер моє баш-підказка виглядає так, із символом фунта (£) замість хеш-символу (#). Це навіть впливає на хеш-символи у файлах, дивіться тут:

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

Будь-яка ідея, як це повернути?

Редагувати: Це запитання не задає "Як змінити мою підказку bash?", Але "мій баш-рядок змінився сам по собі, як я можу його відновити?"

Повне.bashrc для тих, хто цікавиться.


2
Можливий дублікат Як змінити підказку в Linux?
Kevdog777

1
(Я взяв на себе
сміття

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

4
Цікава частина полягає в тому, що "фунт" - це ще одна назва символу хеша в американській (а можливо, й інших національностях?) Англійській мові ... =)
jpmc26

1
У якій термінальній програмі це робилося?
ХропінняFrog

Відповіді:


102

Термінал приймає і виконує купу різних послідовностей символів як команди управління. Наприклад, весь рух курсору здійснюється за допомогою цих. Деякі з кодів вносять постійні зміни, як-от встановлення кольорів або наказ терміналу використовувати альтернативний набір символів. Виконавчі файли та інші двійкові файли цілком можуть містити байти, які представляють ці команди, тому скидання бінарних файлів у термінал може мати прикрими побічними ефектами. Див., Наприклад, тут деякі коди управління.

Історія цього полягає в тому, що спочатку термінали були досить тупими пристроями з екраном і клавіатурою , і вони підключалися до фактичного комп'ютера через послідовний порт. До цього вони були принтерами з клавіатурами. Протоколу для відокремлення байтів даних від байтів команд не було багато, тому команди були віддані терміналу "inline". (А точніше, протоколи і коди управління були протоколом.) Можна припустити, що якби система була розроблена сьогодні, було б чіткіше розділення даних і команд.

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

Я не знаю, що саме спричинить зміну фунта хешу. (Але @ Random832, дивіться їх відповідь .) Я більше знайомий з "альтернативним набором символів", який може змінити всіх символів на лінійні гліфи для малювання. Навіть якщо це трапляється, введення з клавіатури зазвичай проходить незмінно, тому запис resetEnterвсе одно працює, навіть якщо символи відображаються як сміття чи взагалі відсутні. (У порівнянні з тим, що ваше підказка перетворюється на купу рядків, ви отримали лише незначний ефект.)


1
Дякую за детальне пояснення. Я буду голосувати, як тільки отримаю необхідну репутацію.
lhermann

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'

Я здогадався щось подібне, не знаючи деталей. Дякую за пояснення. Як здорово, щоб навколо вас були такі люди, як ви!
lhermann

1
О, шановний, чайки замість Ä і Ö ... А Термінал на OS X навіть підтримує цю заміну, у 2016 р. Якби я мав ще одну нагоду дати.
ilkkachu

@ilkkachu деякі термінали, які інакше їх підтримують (я знаю Putty, і я думаю, що також консоль Linux) відхиляють їх, коли використовується UTF-8, оскільки ISO 2022 говорить, що інші послідовності (крім ESC % @) не підтримуватимуться в стані який використовується для підтримки UTF-8. Таким чином вони можуть зникнути з часом, оскільки більшість додатків змушені використовувати UTF-8 для малювання ліній [що є найбільш широко використовуваним фактичним використанням цієї функції; інші набори символів здебільшого включаються, оскільки це "безкоштовно", коли у вас реалізований механізм ].
Випадково832

20
Неважко запам’ятати ці послідовності втечі: «A» означає британську, «B» означає «американську»: D
egmont

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

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, Скидання до початкового стану : "Скиньте VT100 до його початкового стану, тобто стану, який він має після його включення. Це також спричиняє виконання самоперевірки живлення та сигналу INIT H для стверджуйте коротко ".
дельтаб

1
@deltab Я забув згадати про ESC, дякую мільйон товаришів.
FarazX

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