#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, поэтому я не уверен, почему он усекался.