Цветная подсказка в KornShell


11

Согласно этому сообщению StackOverflow , в KornShell возможно иметь цветную подсказку. Я не смог понять, как это сделать. Я могу использовать цвет:

echo -e "\033[34mLinux\033[00m"

выдает синий вывод "Linux", как:

printf "\033[34mLinux\033[00m"

Однако, когда я включаю управляющие коды в мою PS1переменную подсказки, они не экранируются. Что мне нужно сделать, чтобы получить цветную подсказку? Помимо того, что это что-то вроде присоски для eyecandy, я обнаружил, что цветное приглашение полезно при визуальном разборе вывода.

Ответы:


10

Просто используйте буквенный символ Esc, введенный с Ctrl- v, Esc(будет отображаться как ^[на экране):

PS1="^[[34mLinux^[[00m"

Или используйте вывод echoкоманды, которую вы обнаружили, работает:

PS1="$(echo -e "\033[35mLinux\033[00m")"

В такие моменты я понимаю, что я еще новичок в командной строке. Я обычно чувствую себя так хорошо по сравнению с моими друзьями. :) Первая версия работала хорошо; какой ловкий трюк! У меня не было успеха со второй версией. +1
Казарк

5

Вам нужно поместить буквенный escape-символ в PS1переменную. Ksh88 и клоны, такие как pdksh и mksh (более старые версии), не имеют буквального синтаксиса для управляющих символов, кроме как через printвстроенные. Mksh понимает \eдля выхода, но pdksh требует восьмеричного кода \033.

PS1=$(print '\033[34mLinux\033[00m')

ATT ksh93 представляет синтаксис $'…'с обратной косой чертой (также доступен в mksh начиная с R39b). Вы можете использовать обратную косую черту, чтобы поместить управляющие символы в эти литералы.

PS1=$'\e[34mLinux\e[00m'

2
На самом деле, mkshтакже поддерживает $'…'- по общему признанию, потому что Дейв Корн (Korn в Korn Shell) настоял, чтобы я добавил это.
Мирабилось

@mirabilos Ах, спасибо. Я, вероятно, набрал этот ответ на машине с mksh R39 и не проверял более новые версии.
Жиль "ТАК ... перестать быть злым"

2

Я использую это mkshдля пользователя shell:

# custom prompt see http://comments.gmane.org/gmane.os.miros.mksh/126
PS1=$'\a\r\a\e[1;34m\a ^ ^  ^ ^ | \a\e[36m\a${USER:=$(ulimit -c 0; id -un 2>/dev/null || echo
\?)}@${HOSTNAME%%.*}\a\e[34m\a | ^ ^  ^ ^ | \a\e[0;33m\a$(local d=${PWD:-?} p=~; [[ $p = ?(*/) ]] || d=${d/#$p/~};
print -nr -- "$d")\a\e[1;34m\a |\n ^ ^  ^ ^ | \a\e[32m\a$(date +%H:%M)\a\e[34m\a | ^ ^ >>\a\e[0m\a '

& немного отличается shellдля root:

PS1=$'\a\r\a\e[1;34m\a ^ ^  ^ ^  ^   \a\e[31m\a${USER:=$(ulimit -c 0; \
    id -un 2>/dev/null || echo \?)}@${HOSTNAME%%.*}\a\e[34m\a  ^ ^  ^ ^  ^ ^  ^   \a\e[0;33m\a$(
        local d=${PWD:-?} p=~
        [[ $p = ?(*/) ]] || d=${d/#$p/~}
        print -nr -- "$d"
)\a\e[1;34m\a  ^ ^ \n ^ ^  ^ ^  ^   \a\e[32m\a$(date +%H:%M)\a\e[34m\a  ^ ^  ^ ^   \a\e[0m\a '

введите описание изображения здесь

Поскольку специальные символы не копировались, вот пастинная вставка как для обычного пользователя, так и для пользователя root.


1

В ответах людей происходит несколько вещей, каждый из которых имеет свой синтаксис.

  1. Escape-последовательности для вашей терминальной программы приведены в документации.

  2. Как кодировать escape-последовательности терминала в переменной PS1, например, \ e или литерал escape. Это зависит от оболочки.

  3. Как добавить изменяющуюся информацию в приглашение, например, имя хоста, текущий каталог и т. Д. Это также зависит от оболочки. Вы можете использовать специальные последовательности с обратной косой чертой, такие как \ w, для рабочего каталога, или вам может потребоваться назвать переменные окружения или встроить командные строки в строку.

  4. Как указать оболочке, какие символы печатают, а какие нет. Оболочка не знает, где ваши конечные escape-последовательности начинаются и заканчиваются. Если в оболочке есть редактор командной строки или что-то подобное, ей нужно знать, какие символы печатать, чтобы знать, где находится курсор. Без этой детали ваша подсказка может выглядеть правильно, но редактирование может вести себя странно.

    • В bash вы ставите \ [перед каждой escape-последовательностью и \] после.

    • В ksh вы выбираете один непечатаемый символ ASCII, который не встречается нигде в строке. В начале строки вы пишете этот символ, за которым следует возврат каретки ASCII. Затем вы пишете один и тот же символ до и после каждой escape-последовательности. z3ntu выбрал \ a в качестве символа маркера.


0

Благодаря предыдущим ответам и другим источникам я смог придумать такие:

Корн оболочка подскажет:

PS1="$(echo "\033[32m`logname`\033[35m@\033[32m`hostname` \033[33m`pwd`\033[36m\n\$\033[0m")"

Bash подскажите:

PS1="\[\e[32m\]\u\[\e[35m\]@\[\e[32m\]\h \[\e[33m\]\w\[\e[36m\]\n\$\[\e[0m\]"

Они дают одинаковые цветные подсказки (да, я говорю по-английски Queen;)) в формате:

username@computername /current/working/directory
$

Эквивалент DOS (хотя нет вариантов цвета):

prompt %username%@%computername% $P$_$G

который дает:

username@computername /current/working/directory
>

«>» Сохраняет это «DOSsy», а не «nixy» с «$», но если вы хотите вместо этого использовать символ («$»), то это будет:

prompt %username%@%computername% $P$_$$

При условии, что ваша учетная запись имеет необходимые разрешения, чтобы постоянные 'nixies' добавили к ним «export»:

export PS1="..."

и измените DOSsy на:

setx PROMPT "%username%@%computername% $P$_$G"

или же

setx PROMPT "%username%@%computername% $P$_$$"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.