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

10

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

Пример:

root @ hostname [~] # echo -n привет
helloroot @ hostname [~] #

Я всегда находил это очень раздражающим.
Теперь я мог бы просто добавить «\ n» в начале переменной PS1, но большую часть времени это будет выводить одну лишнюю строку, которая мне не нужна.

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


Решение:
(Спасибо Деннису)

PS1='$(printf "%$((`tput cols`-1))s\r")\u@\h [\w]\$ '
Получить бесплатно
источник
Это должно быть перенесено в суперпользователя.
ℝaphink
Мне нравится ваша версия! Вы использовали $()в одном месте и клюшки в другом. Вы можете использовать $()в обоих.
Приостановлено до дальнейшего уведомления.
Я знаю. Но для меня так проще читать
GetFree
Я бы не использовал, tput colsпотому что он все равно выводит значение переменной COLUMNS, и он медленнее, потому что это не встроенная оболочка. Вы также захотите включить \e[K(эквивалентно tput el) удалить вставленный пробел, чтобы вы не получили кучу конечных пробелов при копировании и вставке в случае по умолчанию. Наконец, вам нужно заключить всю эту магию между, \[и \]иначе bash попытается угадать вашу позицию курсора, и она испортится при редактировании вашей команды / истории.
Dlitz
1
Все это может быть сделано просто:PS1='\[\e[7m%\e[m$( printf "%*s" "$((COLUMNS-1))" "" )\r\e[K\]\u@\h [\w]\$ '
dlitz

Ответы:

6

Я экспериментировал со следующим, чтобы эмулировать эту функцию 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$ '

Он выдает обратный видео знак процента, за которым следует куча пробелов, чтобы перенести его на следующую строку, затем возврат каретки, затем знак доллара и пробел. Вы можете добавить экранирование подсказки после "\ 015", чтобы настроить подсказку.

Использование этого зависит от того, как ваш терминал обрабатывает перенос правой строки поля (автоматические поля). Длина PROMPT_SP произвольна, но должна быть не менее 80 или любой другой ширины вашего терминала. Возможно, вам придется жестко закодировать это значение, если $ COLUMNS еще не установлено к моменту forзапуска цикла ~/.bashrc. Вы можете хотеть, shopt -s checkwinsizeесли это еще не установлено.

Приостановлено до дальнейшего уведомления.
источник
Интересно, почему кто-то отрицал каждый ответ . Хм ... без объяснения причин. Как полезно
Приостановлено до дальнейшего уведомления.
Вот еще один способ, без использования цикла, для создания строки пэда:printf -v PROMPT_SP '%*s' $((COLUMNS + 52)) ''
Пауза до дальнейшего уведомления.
Что такое «знак процента обратного видео»? Слово «видео» сбило меня с толку, и я не смог найти ответ в Google.
Дэвид Чамберс
1
@davidchambers: фон символа отображается в цвете переднего плана, а сам символ отображается в цвете фона. Смотрите man 5 terminfoи ищите «обратное видео», чтобы увидеть некоторую документацию, которая использует эту терминологию.
Приостановлено до дальнейшего уведомления.
0

Нет, это невозможно. Сам Bash не обрабатывает и не видит вывод программы, которую он запустил.

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

Тедди
источник
Отличная идея. Единственная проблема ... возможно ли узнать положение курсора?
GetFree
0

zshпытается решить вашу проблему. Если последний вывод заканчивается без новой строки, вы получите:

$ echo -n 'abc'
abc%
$ 

Где %используется перевернутый фон / передний план. Не уверен, что он переносится bashкаким-либо образом.

viraptor
источник