Основываясь на информации, которую я нашел здесь, я смог найти более простое решение для выравнивания по правому краю с учетом содержимого переменной длины справа или слева, включая поддержку цвета. Добавлено здесь для вашего удобства ...
Примечание по цветам: использование \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
, указав " $
", или любое другое значение, которое вы предпочитаете.
В следующем примере $RANDOM
показано, как генерировать содержимое различной длины, включая цвета, и показано, как можно извлечь функции для рефакторинга реализации в повторно используемые функции.
function prompt_right() { echo -e "\033[0;36m$(echo $)\033[0m" } function prompt_left() { echo -e "\033[0;35m$\033[0m" } function prompt() { compensate=11 PS1=$(printf "%*s\r%s\n\$ " "$(($(tput cols)+$))" "$(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)+$))" "$(prompt_right)" "$(prompt_left)") } PROMPT_COMMAND=prompt
NJoy!