Почините терминал после отображения двоичного файла

Это - классическое состояние состязания, таким образом, результат непредсказуем по определению.

Среди других это зависит от

  • fopen(3) или open(2) режимы записи,
  • как/если устройство записи буферизует его вывод,
  • как читатель читает файл,
  • различие в скорости между средством чтения и устройством записи,
  • разница во времени между чтением и запуском писателя.
  • И конечно, на современных многоядерных машинах, вещи являются сложными еще больше другими факторами, опускаются (например, диспетчеризация процессов).

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

130
18.06.2013, 01:31
7 ответов

Часто времена, когда в терминале Unix/Linux (Bash), например, Вы будете использовать команды more или less или cat просмотреть файл. Когда Вы делаете это и файл не предназначены, чтобы быть просмотренными (такой как /bin/ls) Вы будете произведены как это:

                ss of binary output

Что продолжается, вот то, что Вы просто попытались просмотреть файл, это - программа. Исполняемый файл, которые не предназначены, чтобы быть просмотренными со стандартными средствами просмотра, поскольку я упомянул выше.

метод № 1 - сброс

Для устранения этой проблемы, можно сделать следующее:

  1. Управление хитом + C пару раз (Ctrl+C)
  2. Введите команду reset и возврат хита

Это должно обычно откладывать Ваш терминал в более нормальный режим. Я упомяну еще одну вещь, когда Вы сделаете шаги выше, Вы будете путем ввода их слепой в терминал. Поэтому просто удостоверьтесь, что Вы вводите его правильно.

метод № 2 - stty нормальный

Как предложено в комментариях @sendmoreinfo у Вас могла бы быть лучшая удача с помощью следующих команд вместо этого, если вышеупомянутое не работает:

$ stty sane
$ tput rs1

определение типа файлов

Кстати, если Вы сталкиваетесь с файлом и не уверены, собирается ли он испортить Ваш терминал, можно осмотреть файл с помощью команды file который сообщит тип файла, это.

Например, с /bin/ls тот файл показывает следующий вывод:

$ file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, stripped
179
27.01.2020, 19:29
  • 1
    reset не 100%-е средство исправления для терминального безумия. Попробовать stty sane сопровождаемый tput rs1. –  sendmoreinfo 17.06.2013, 17:22
  • 2
    @sendmoreinfo - спасибо я добавил Ваше предложение к ответу. Я использовал stty sane но никогда tput. –  slm♦ 17.06.2013, 18:01
  • 3
    на самом деле, я должен исследовать это больше. сброс, как предполагается, отправляет строку rs1. Хороший тест (для xterm, по крайней мере) должен сделать курсор невидимым и видеть, возвращает ли сброшенный его. –  sendmoreinfo 17.06.2013, 20:15
  • 4
    reset работавший в моем случае –  code_monk 08.03.2015, 16:06
  • 5
    clear также работы для умеренных случаев. –  Navin 02.11.2015, 07:41

У меня был случай, когда ни один из обычных приемов, reset или stty sane , не работал (после случайного вызова print в массиве байтов python). Я добился успеха с методом 2, перечисленным в этом полезном блоге .

С тех пор я создал очень полезный псевдоним:

alias fix='echo -e "\033c"'
38
27.01.2020, 19:29

Ни один предыдущий ответ не помог мне. Но, похоже, это сработало в .bashrc add:

alias fix='reset; stty sane; tput rs1; clear; echo -e "\033c"'

, а затем, когда возникнет проблема, введите это (даже если вы, вероятно, этого не видите!)

(ctl-c, ctl-c, ctl-c)
fix

Большое спасибо предыдущим отправителям. Кроме того, в качестве примечания, причина того, что ваш терминал не работает при отображении этих исполняемых файлов (или хранилищ ключей и т. Д.), Заключается в том, что эти файлы часто содержат двоичные последовательности, которые являются управляющими кодами. Управляющие коды могут выполнять случайные действия, например переключаться на набор графических символов, устанавливать одинаковые цвета переднего плана и фона и т. Д.

11
27.01.2020, 19:29

У меня почти такой же псевдоним, как и в предыдущем сообщении, с одним небольшим изменением ( tput reset вместо rs1 ) и одна добавленная команда ( setterm -reset ):

alias clr='echo -e "\033c" ; stty sane; setterm -reset; reset; tput reset; clear'
3
27.01.2020, 19:29

Пользователи tmuxмогут отправлять все эти команды в свою оболочку, но сброс не переходит на панель tmux.

Создать новое окно tmux: ctrl-B c панели списка tmux Обратите внимание на номер панели, который, по вашему мнению, не работает, обычно 0. Давайте назовем его PPP

Выберите окно tmux, где XXX— номер окна, которое борется, не обязательно совпадает с номером панели. ctrl-B XXX tmux send-key -R -t PPP

Затем вы увидите все команды в других ответах на этот вопрос, которые попали в вашу оболочку, но не сработали! Возможно слепой tmux send-key -R -t PPPсработает, но проверить не могу.

4
27.01.2020, 19:29

В дополнение к другим ответам на вопросы о том, как сбросить настройки терминала, я полагал, что повреждения нельзя избежать, если не будут должным образом защищены. Поэтому я лучше отправлю вывод в простой текстовый -дружественный конвертерcat -v:

docker logs myjenkinscontainer 2>&1 | cat -v

Просмотр и редактирование двоичных файлов возможно с помощью hexdump -Cиvi -R(:%!xxd -g1для шестнадцатеричного представления и :%!xxd -g1 -rдля сохранения шестнадцатеричных изменений ).

1
27.01.2020, 19:29

Я знаю, что это было здесь некоторое время, но, хотя многие другие ответы сработали для меня, reset, stty sane, иногда ни один из них не работал для меня, и я всегда прибегаю к:

echo ^v^o

Это эхо Ctrl+V, за которым следует Ctrl+O

2
30.01.2020, 14:41

Теги

Похожие вопросы