Назад | Перейти на главную страницу

Bash: как узнать, заканчивается ли вывод последней команды символом новой строки или нет?

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

Пример:

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, который будет проверять текущую позицию курсора и выдавать новую строку, если курсор не находится на левом краю.