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