Pergunta

Na minha situação atual, não é incomum para mim ter vários computadores UNIX I conectar, como vários usuários diferentes, dependendo da situação, e para atravessar através de vários diretórios nas máquinas de fazer as coisas. Eu uso ksh por toda a coisa.

Eu estava brincando com a minha rápida recentemente, e eu era capaz de fazê-lo mudar algumas cores dependendo do meu nome de usuário atual e servidor atual. No entanto, o que eu também gostaria é para que alterar as cores com base na minha diretório atual. Por exemplo, se eu estivesse no diretório "foo", a solicitação deve ser amarelo, mas se eu fosse no diretório "bar", o prompt seria magenta. Em ambos os casos, os subdiretórios também deve contar, então uma verificação substring simples deve ser suficiente.

O problema que eu tive, no entanto, é que quando eu executar o meu script .profile,-lo corretamente cores do diretório - mas já não se atualiza dinamicamente sempre que eu mudar para outro diretório - e eu não tenho certeza de como antes Eu fiz toda a ramificação, eu era capaz de obtê-lo para imprimir o meu diretório de trabalho atual corretamente, mesmo depois de eu ter mudado diretórios.

Eu fiz algum googling e encontrar informações para a festança, mas ksh parece estar largamente ignorado. Como eu não consigo descobrir como fazer isso no meu próprio, devo trazê-lo para a comunidade Stack Overflow, adicioná-lo ao conhecimento futuro. Assim, com a minha longa explicação, a "versão rápida" da minha pergunta é a seguinte:

Em ksh, como posso configurar meu aviso para exibir o atual diretório de trabalho e cor do texto com base em onde o diretório de trabalho atual é? Será que é mesmo possível?

Outras dicas

Por que não usar zsh? Ele é baseado no ksh, e é muito mais poderoso. Em zsh você pode escrever função chpwd que é chamado implicitamente cada vez que mudar de diretório. Nesta função, você pode verificar o seu diretório atual e conjunto PS1 para o que quiser.

Como alternativa (mesmo em ksh), você pode criar um alias para o comando cd:

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

Algo como isso. Eu não tenho certeza se é adequada, não me lembro de sintaxe ksh.

Para exibir o diretório atual em ksh, colocar isso em seu arquivo .profile: export PS1 = "\ $ PWD" Isso vai atualizar dinamicamente quando você mudar o diretório, sem perder tempo com funções.

Uma vez que ninguém realmente respondeu a parte sobre a cor, aqui está como eu faria isso. Eu não pode colorir o texto, então eu também incluímos um screenshot do meu terminal.

da Wikipedia sobre os códigos de escape ANSI para a lista completa de códigos de cores e print --man e printf --man para os detalhes da impressão sequências de escape em ksh.

(Note que ksh93v, atualmente em beta, irá conter um idioma de prompt base (eu acho) na festa de, que vai fazer esse tipo de coisa um pouco mais fácil, embora eu acho que você provavelmente ainda vai precisar usar algo como esta função fazer solicitações condicionais complexos como este.)

> 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 descrição da imagem aqui

Eu uso este:

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

Ignorar o tempo e hname, mas o resto deve trabalhar para você. Mudança de cores vai ser terminal dependente. Você precisa saber os códigos de escape para cada cor para o terminal você estará usando. Se você sabe que você só usar um xterm, será mais fácil.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top