Виходячи з інформації, яку я знайшов тут, я зміг знайти більш просте рішення для вирівнювання по праву під час розміщення вмісту змінної довжини праворуч або ліворуч, включаючи підтримку кольору. Додано тут для вашої зручності ...
Примітка щодо кольорів: використання \033втечі на користь альтернатив, без \[\]групувань, виявляється найбільш сумісним і рекомендованим для цього.
Трюк полягає в тому, щоб спочатку написати праву частину, а потім скористатися return carriage ( \r), щоб повернутися до початку рядка і продовжувати перезапис вмісту лівої сторони поверх цього, як слід:
prompt() {
PS1=$(printf "%*s\r%s\n\$ " "$(tput cols)" 'right' 'left')
}
PROMPT_COMMAND=prompt
Я використовую tput colsна Mac OS X для отримання ширини терміналу / консолі, terminfoоскільки мій $COLUMNSvar не заповнений, envале ви можете замінити замінене значення " *" %*s, надаючи " ${COLUMNS}" або будь-яке інше значення, яке ви віддаєте перевагу.
Наступний приклад використовує $RANDOMдля генерування вмісту різної довжини, включає кольори та показує, як ви можете витягувати функції для рефакторації реалізації до функцій багаторазового використання.
function prompt_right() {
echo -e "\033[0;36m$(echo ${RANDOM})\033[0m"
}
function prompt_left() {
echo -e "\033[0;35m${RANDOM}\033[0m"
}
function prompt() {
compensate=11
PS1=$(printf "%*s\r%s\n\$ " "$(($(tput cols)+${compensate}))" "$(prompt_right)" "$(prompt_left)")
}
PROMPT_COMMAND=prompt
Оскільки printfпередбачається, що довжина рядка дорівнює # символів, нам потрібно компенсувати кількість символів, необхідних для візуалізації кольорів, ви знайдете його завжди недоступним до кінця екрана через недруковані символи ANSI без компенсації. Символи, необхідні для кольору, залишаються постійними, і ви побачите, що також printf враховує зміну довжини, повернену, $RANDOMнаприклад, ', що зберігає наше правильне вирівнювання в такті.
Це не той випадок зі спеціальною Баш рядки керуючих послідовностями (тобто .. \u, \w, \h, \t) , Хоча, як це буде тільки записувати довжину 2 , тому що баш буде переводити тільки їх , коли з'явиться підказка, після Printf виніс рядок. Це не стосується лівої сторони, але краще уникати їх праворуч.
Немає наслідків, якщо створений вміст залишатиметься незмінним. Як і з \tваріантом часу, який завжди відображатиме однакову кількість символів (8) протягом 24 разів. Нам потрібно лише врахувати компенсацію, необхідну для врахування різниці між двома символами, що підраховуються, що призводить до 8 символів при друкуванні в цих випадках.
Майте на увазі, що вам може знадобитися втричі вийти з \\\деяких послідовностей евакуації, які інакше мають значення для рядків. Як і в наступному прикладі, поточне втечу робочого каталогу \wне має сенсу, інакше воно працює як очікувалося, але час \t, що означає символ вкладки, не працює так, як очікувалося, без потрійного уникнення першого.
function prompt_right() {
echo -e "\033[0;36m\\\t\033[0m"
}
function prompt_left() {
echo -e "\033[0;35m\w\033[0m"
}
function prompt() {
compensate=5
PS1=$(printf "%*s\r%s\n\$ " "$(($(tput cols)+${compensate}))" "$(prompt_right)" "$(prompt_left)")
}
PROMPT_COMMAND=prompt
nJoy!