Большую часть времени вывод команды заканчивается символом новой строки. Но иногда этого не происходит, поэтому следующее приглашение оболочки выводится в той же строке вместе с выводом.
Пример:
root @ hostname [~] # echo -n привет
helloroot @ hostname [~] #
Я всегда находил это очень раздражающим.
Теперь я мог бы просто добавить «\ n» в начале переменной PS1, но большую часть времени это будет выводить одну лишнюю строку, которая мне не нужна.
Можно ли узнать, закончился ли вывод последней команды новой строкой или нет?
Решение:
(Спасибо Деннису)
PS1='$(printf "%$((`tput cols`-1))s\r")\u@\h [\w]\$ '
$()
в одном месте и клюшки в другом. Вы можете использовать$()
в обоих.tput cols
потому что он все равно выводит значение переменной COLUMNS, и он медленнее, потому что это не встроенная оболочка. Вы также захотите включить\e[K
(эквивалентноtput el
) удалить вставленный пробел, чтобы вы не получили кучу конечных пробелов при копировании и вставке в случае по умолчанию. Наконец, вам нужно заключить всю эту магию между,\[
и\]
иначе bash попытается угадать вашу позицию курсора, и она испортится при редактировании вашей команды / истории.PS1='\[\e[7m%\e[m$( printf "%*s" "$((COLUMNS-1))" "" )\r\e[K\]\u@\h [\w]\$ '
Ответы:
Я экспериментировал со следующим, чтобы эмулировать эту функцию
zsh
в Bash:Он выдает обратный видео знак процента, за которым следует куча пробелов, чтобы перенести его на следующую строку, затем возврат каретки, затем знак доллара и пробел. Вы можете добавить экранирование подсказки после "\ 015", чтобы настроить подсказку.
Использование этого зависит от того, как ваш терминал обрабатывает перенос правой строки поля (автоматические поля). Длина PROMPT_SP произвольна, но должна быть не менее 80 или любой другой ширины вашего терминала. Возможно, вам придется жестко закодировать это значение, если $ COLUMNS еще не установлено к моменту
for
запуска цикла~/.bashrc
. Вы можете хотеть,shopt -s checkwinsize
если это еще не установлено.источник
printf -v PROMPT_SP '%*s' $((COLUMNS + 52)) ''
man 5 terminfo
и ищите «обратное видео», чтобы увидеть некоторую документацию, которая использует эту терминологию.Нет, это невозможно. Сам Bash не обрабатывает и не видит вывод программы, которую он запустил.
Это просто произошло со мной , что это может быть возможным , чтобы написать программу для набора
PROMPT_COMMAND
к, который будет проверять текущую позицию курсора и выдать строку , если курсор не находился на левом краю.источник
zsh
пытается решить вашу проблему. Если последний вывод заканчивается без новой строки, вы получите:Где
%
используется перевернутый фон / передний план. Не уверен, что он переноситсяbash
каким-либо образом.источник