Bash: як дізнатися, чи закінчується вихід останньої команди новим рядком чи ні?


10

Більшу частину часу вихід команди закінчується символом нового рядка. Але іноді це не відбувається, тому наступне запит оболонки друкується в тому ж рядку разом з висновком.

Приклад:

root @ hostname [~] # echo -n привіт
helloot @ hostname [~] #

Я завжди вважав це дуже прикро.
Тепер я можу просто додати "\ n" на початку змінної PS1, але більшу частину часу, яка надрукує один додатковий рядок, який мені не потрібен.

Чи можна знати, закінчився вихід останньої команди новим рядком чи ні?


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

PS1='$(printf "%$((`tput cols`-1))s\r")\u@\h [\w]\$ '

Це слід перенести на суперпользователь.
phaphink

Мені подобається ваша версія! Ви використовували $()в одному місці, а зворотні посилання в іншому. Ви можете використовувати $()в обох.
Призупинено до подальшого повідомлення.

Я знаю. Але мені простіше читати саме так
GetFree

Я б не використовував, tput colsтому що він просто виводить значення змінної COLUMNS у будь-якому випадку, і це повільніше, оскільки це не вбудована оболонка. Ви також захочете включити \e[K(еквівалент tput el) для видалення вставленого пробілу, щоб у вас не було купі пробілу пробілів при копіюванні та вставці у випадку за замовчуванням. Нарешті, вам потрібно вкласти всю цю магію між \[і, \]або ще, bash спробує вдруге відгадати ваше положення курсору, і воно зіпсується, коли ви редагуєте свою команду / історію.
дліт

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.
davidchambers

1
@davidchambers: фон символу відображається кольором переднього плану, а сам символ відображається у кольорі фону. Перегляньте man 5 terminfoі знайдіть "зворотне відео", щоб переглянути деяку документацію, яка використовує цю термінологію.
Призупинено до подальшого повідомлення.

0

Ні, це неможливо. Сам Bash не обробляє і не бачить вихід програми, яку він запустив.

Мені просто сталося, що можна було б написати програму, яку слід встановити PROMPT_COMMAND, яка перевірила б поточне положення курсору та випустила новий рядок, якщо курсор не знаходився з лівого краю.


Гарна ідея. Єдина проблема - чи можна дізнатися положення курсору?
GetFree

0

zshнамагається вирішити вашу проблему. Якщо останній вихід закінчується без нового рядка, ви отримаєте:

$ echo -n 'abc'
abc%
$ 

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.