Кольорова підказка в KornShell


11

Відповідно до цієї публікації StackOverflow , можливо, є кольоровий рядок у KornShell. Я так і не зміг зрозуміти, як це зробити. Я вмію використовувати колір:

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

дає синій "Linux" вихід, як і:

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

Однак, коли я включаю коди евакуації у свою PS1швидку змінну, вони не виходять. Що мені потрібно зробити, щоб отримати кольоровий підказку? Окрім того, що є чимось присмоктувачем для очей, я вважаю, що кольоровий рядок корисний під час візуального розбору результатів.

Відповіді:


10

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

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

Або скористайтеся результатом echoкоманди, яку ви виявили, працює:

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

Іноді, як це, я розумію, що я все ще noob командного рядка. Зазвичай я відчуваю себе так добре порівняно зі своїми друзями. :) Перша версія працювала чудово; яка акуратна хитрість! У мене не було успіху з другою версією. +1
Kazark

5

Потрібно поставити буквальний символ втечі у 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також підтримує $'…'- правда, тому, що Дейв Корн (Корн у Корн-Шеллі) наполягав на тому, щоб я його додав.
mirabilos

@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. Послідовності виходу для вашої термінальної програми наведені в документації.

  2. Як кодувати термінальні аварійні послідовності у змінній PS1, наприклад \ e або в прямому значенні. Це залежить від оболонки.

  3. Як додати зміну інформації до підказки, наприклад, ім'я хосту, поточний каталог тощо. Це також залежить від оболонки. Можливо, ви зможете використовувати спеціальні послідовності зворотної косої риси, такі як \ w для робочого каталогу, або, можливо, доведеться називати змінні середовища або вставляти командні рядки в рядок.

  4. Як сказати оболонці, які символи друкуються, а які - ні. Оболонка не знає, звідки починаються і закінчуються ваші послідовності втечі. Якщо в оболонці є редактор командного рядка або щось подібне, вона повинна знати, які символи друкуються, щоб вона знала, де знаходиться курсор. Без цієї деталі ваш запит може виглядати правильно, але редагування може вести себе дивно.

    • У bash ви ставите \ [перед кожною послідовністю втечі та \] після.

    • У ksh ви вибираєте один недрукований символ ASCII, який не може зустрічатися ніде в рядку. На початку рядка ви записуєте цього символу з подальшим поверненням каретки ASCII. Потім ви пишете одного і того ж символу до і після кожної послідовності втечі. 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\]"

Вони надають однакову кольорову підказку (так, я розмовляю англійською королевою;)) у форматі:

username@computername /current/working/directory
$

Еквівалент DOS (хоча немає кольорових варіантів):

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

що дає:

username@computername /current/working/directory
>

">" Зберігає його "DOSsy", а не "nixy" з "$", але якби ви хотіли, щоб сигіл ("$") був би:

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

За умови, що ваш обліковий запис для входу має необхідні дозволи, щоб "nixies" постійно додавали їх до "експорту":

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.