Основываясь на информации, которую я нашел здесь, я смог найти более простое решение для выравнивания по правому краю с учетом содержимого переменной длины справа или слева, включая поддержку цвета. Добавлено здесь для вашего удобства ...
Примечание по цветам: использование \033
выхода в пользу альтернатив, без \[\]
группировок, оказывается наиболее совместимым и поэтому рекомендуемым.
Хитрость заключается в том, чтобы сначала написать правую часть, а затем с помощью возврата каретки ( \r
) вернуться к началу строки и продолжить перезаписывать содержимое левой части поверх этого следующим образом:
prompt() {
PS1=$(printf "%*s\r%s\n\$ " "$(tput cols)" 'right' 'left')
}
PROMPT_COMMAND=prompt
Я использую tput cols
в Mac OS X для получения ширины терминала / консоли, terminfo
поскольку моя $COLUMNS
переменная не заполнена, 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 раз. Нам нужно только учесть компенсацию, необходимую для учета разницы между подсчитанными 2 символами, которая в этих случаях приводит к 8 символам при печати.
Имейте в виду, что вам может потребоваться тройной экранирование \\\
некоторых escape-последовательностей, которые в противном случае содержат значение для строк. Как и в следующем примере, текущий экранирование рабочего каталога \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!