Как мне предотвратить перезапись строки терминала?

#linux #bash

#linux #bash

Вопрос:

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

Ниже приведены примеры того, что происходит.

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

 bbbbbbbbbbbbbbbbbb ~ $ bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 
  

Это то, что происходит, когда я печатаю ps aux . Та часть, где должно быть написано «Application», обрезается до «Applica».

 root                66   0.0  0.7  4698940 123008   ??  Ss   Thu06PM   4:15.86 /Library/Applica
  

После некоторых исследований я обнаружил, что непечатаемые символы должны быть экранированы с помощью [ и ] , так что это то, что я сделал в своем файле .bashrc.

 //Before
LANG=ja_JP.UTF-8
PS1='[u@h] w $ '
export LESS='--no-init'

set -o ignoreeof

shopt -s histappend
HISTSIZE=1000000
HISTFILESIZE=1000000

alias ls='ls -F'
alias la='ls -a'
alias ll='ls -l'
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias mkdir='mkdir -p'
export PATH="$HOME/.anyenv/bin:$PATH"
eval "$(anyenv init -)"

  
 //After
LANG=ja_JP.UTF-8
PS1='[u@h w] $'     <----- Changed
export LESS='--no-init'

set -o ignoreeof

shopt -s histappend
shopt -s checkwinsize     <----- Changed
HISTSIZE=1000000
HISTFILESIZE=1000000
COLUMNS=250               <----- Changed

alias ls='ls -F'
alias la='ls -a'
alias ll='ls -l'
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias mkdir='mkdir -p'
export PATH="$HOME/.anyenv/bin:$PATH"
eval "$(anyenv init -)"
  

Я также установил размер столбца равным 250 (COLUMNS = 250) и сделал так, чтобы он также проверял размер окна (shopt -s checkwinsize), и он все еще не работает.

Может ли кто-нибудь дать мне совет по этому поводу?

Комментарии:

1. Пожалуйста, проверьте ваш файл на наличие окончаний строк dos и непечатаемых символов.

2. Если вы нажмете ctrl Q / ctrl L или наберете reset / clear , вы получите какое-либо улучшение? Я не пробовал ваш код, но я подозреваю, что что-то меняет его неосознанно.

3. Спасибо за ваш комментарий. Я перепробовал все команды, и у меня все еще нет улучшений.

Ответ №1:

Вы уверены, что это проблема с вашим терминалом в целом, а не с некоторыми командами конкретно? Здесь я вижу две разные проблемы:

Ниже приведен один из примеров того, что происходит, когда я набираю «ps aux». Часть, в которой должно быть указано «Приложение», обрезается до «Applica».

Некоторые команды, такие как ps , будут адаптировать свои выходные данные к доступному размеру экрана при интерактивном запуске на терминале, например, путем учета COLUMNS переменной среды или получения доступного размера самостоятельно.

В зависимости от команды вы можете принудительно выполнить полный вывод с соответствующим флагом для команды, например, с помощью ps --cols <n> или ps -ww , или вы можете передать вывод через другую команду, например:

 ps aux | cat
  

Поскольку here ps выводит не (напрямую) на экран, а в канал, он не будет усекать длинные строки, cat а затем выводит строки без изменений.

После некоторых исследований я обнаружил, что непечатаемые символы должны экранироваться с помощью [ и]

Это относится к управляющим символам для использования цветов, например, чтобы bash можно было рассчитать правильную длину печатаемых символов в приглашении. Но с вашим изменением

 PS1='[u@h w] $'     <----- Changed
  

вы на самом деле вызываете проблему здесь, потому u что , h и w будет заменен простым текстом, т.Е. Только _printable символами, которые bash теперь больше не будут корректно учитываться в длине приглашения! Поэтому вам следует отменить эту строку.

Также:

 shopt -s checkwinsize     <----- Changed
# ...
COLUMNS=250               <----- Changed
  

Поскольку checkwinsize будет COLUMNS автоматически обновляться, настройка COLUMNS здесь не будет иметь никакого эффекта.

Комментарии:

1. Большое спасибо за ваш комментарий! Как вы сказали, я вернул строку PS1 и стер строку СТОЛБЦОВ = 250. Однако я все еще получаю неожиданный результат. Ниже приведен пример того, что происходит, когда я набираю слишком длинное слово, оно начинает перезаписывать строку, в которой я нахожусь. ` bbbbbbbbbbbbbbbbbb ~ $ abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb ` ps aux | cat работал, слова не отрезать. Однако, когда я попытался ps aux , размер терминала был установлен на максимальный размер, и у меня не было никаких установленных переменных среды columns, поэтому я не уверен, почему он усекался.