Имя каталога раскраски в кш - PullRequest
2 голосов
/ 27 апреля 2009

В моей текущей ситуации для меня нет ничего необычного в том, чтобы иметь несколько компьютеров UNIX, к которым я подключаюсь, как несколько разных пользователей в зависимости от ситуации, и проходить через различные каталоги на машинах, которые делают что-то. Я использую ksh через все это.

Недавно я возился с моей подсказкой и смог заставить ее менять некоторые цвета в зависимости от моего текущего имени пользователя и текущего сервера. Однако я также хотел бы, чтобы он менял цвета в зависимости от моего текущего каталога. Например, если бы я находился в каталоге «foo», подсказка должна быть желтой, но если бы я была в каталоге «bar», подсказка была бы пурпурной. В обоих случаях подкаталоги также должны учитываться, поэтому простой проверки подстроки должно быть достаточно.

Однако проблема, с которой я столкнулся, заключается в том, что когда я запускаю свой сценарий .profile, он правильно окрашивает каталог - но он больше не обновляется динамически при каждом переключении на другой каталог - и я не уверен, как раньше Я сделал все ответвления, я смог заставить его правильно распечатать мой текущий рабочий каталог даже после того, как я переключил каталоги.

Я немного погуглил и нашел информацию для bash, но ksh, похоже, в значительной степени игнорируется. Поскольку я не могу понять, как это сделать самостоятельно, я должен принести его в сообщество Stack Overflow, чтобы добавить его к будущим знаниям. Таким образом, с моим скучным объяснением, «быстрая версия» моего вопроса такова:

В ksh, как мне настроить мое приглашение отображать текущий рабочий каталог и раскрашивать текст в зависимости от того, где находится текущий рабочий каталог? Это вообще возможно?

Ответы [ 5 ]

1 голос
/ 28 февраля 2010

Чтобы отобразить текущий каталог в ksh, поместите его в ваш файл .profile: экспорт PS1 = "\ $ PWD" Это будет динамически обновляться, когда вы меняете каталог без перебора функций.

1 голос
/ 30 апреля 2009
1 голос
/ 27 апреля 2009

Почему бы не использовать Zsh? Он основан на ksh и гораздо более мощный. В zsh вы можете написать функцию chpwd, которая вызывается неявно каждый раз, когда вы меняете каталог. В этой функции вы можете проверить свой текущий каталог и установить PS1 на то, что вы хотите.

В качестве альтернативы (даже в ksh) вы можете создать псевдоним для команды cd:

change_my_ps() {
  PS1=...
}
better_cd() {
  builtin cd "$@"
  change_my_ps
}
alias cd=better_cd

Как то так. Я не уверен, что это правильно, я не помню синтаксис ksh.

0 голосов
/ 18 сентября 2015

Поскольку никто на самом деле не ответил на часть о цвете, вот как я это сделаю. Я не могу раскрасить текст, поэтому я также включил снимок экрана моего терминала.

См. Страницу Википедии о кодах выхода ANSI для получения полного списка цветовых кодов, а также print --man и printf --man для подробной информации о печати escape-последовательностей в ksh.

(Обратите внимание, что ksh93v, который в настоящее время находится в бета-версии, будет содержать язык подсказок, основанный (я думаю) на bash, что несколько упростит такие вещи, хотя я думаю, что вам, вероятно, все еще нужно будет использовать что-то вроде этой функции делать сложные условные подсказки, подобные этой.)

> cat ~/scripts/prompt    
function prompt
{
    set -eu
    typeset c=
    case $PWD in
        */foo) c=3;; # yellow
        */bar) c=5;; # magenta
    esac
    print "\E[3${c}m$PWD\E[m > "
}
PS1='`prompt`'
> . ~/scripts/prompt
/Users/adavies > cd foo  
/Users/adavies/foo > cd ../bar
/Users/adavies/bar > 

enter image description here

0 голосов
/ 02 мая 2009

Я использую это:

function chdir
{
   cd "$@"
   CWDH=${PWD%/*}
   PS1="($_time)$hname:${CWDH##*/}/${PWD##*/} ->"
   export PS1
}
alias cd=chdir
chdir .

Игнорируйте время и имя, но остальное должно работать на вас. Изменение цвета будет зависеть от терминала. Вам необходимо знать коды выхода для каждого цвета терминала, который вы будете использовать. Если вы знаете, что используете только xterm, вам будет проще.

...