Introdução

Prompts do shell são úteis ferramentas que simplificam a vida de administradores de sistemas e usuários regulares, se configurado corretamente. Eles se tornaram uma arte esotérica em bash como bash tem macros especiais para PS1-PS4 que simplificam a construção dos reservatórios complexos. Infelizmente, muitos destes exemplos esotéricos não são úteis.

Em qualquer caso o prompt do bash padrão é demasiado simplista. Até mesmo um pouco mais complexo em tais como

export PS1='\u@\h:${PWD##/*/*}${PWD#${PWD%/*/*}} # '

representa uma melhoria que ambas as correntes e diretório pai são exibidos em vez de corrente só que não é realmente útil.

Também há perversões em uma formas de regimes Coloraτπo esotéricos. Um uso modesto de colorir esquemas (por exemplo, vermelhas para raiz, azul para um usuários comuns) é útil, mas depois que o retorno sobre o investimento diminui drasticamente. Mas colorir alerta em vermelha ajuda a evitar a raiz ajuda a evitar erros caros.

Então por favor não gaste muito tempo inventando uma nova coloração super esquema para seus prompts (algumas pessoas passaram meses tentando várias combinação de cores para diferentes hosts;-).

Clássico prompt de Unix geralmente olhar de forma diferente para a raiz e os usuários regulares:

usuários regulares : $ username@hostname:/path

raiz: hostname: / caminho #

O problema aqui é que ansiamos caminho tornou-se menos utilizável. Então uma boa melhora é caminho de impressão superior de uma linha separada, se o comprimento do caminho é mais longo, em seguida, dizer 20 caracteres. 

Bash prompt customarization

Ao personalizar o prompt do bash, você pode operar em três níveis:

  • Códigos especiais
  • Bater os códigos de Escape de cor
  • Bater P visar o comando

Existem várias páginas da web, com exemplos de prompts de Brito. Alguns deles são muito educativos

  • Personalizar seu Prompt do Bash – Linux Digest
  • Personalizando seu TwistedCode Prompt do Bash
  • dotfiles.org Comunidade
  • Exemplos de arquivos. bashrc

A regra mais importante em personalizar o prompt de Brito é “não muito zelo”;-).

Códigos especiais

Festança fornece um conjunto de macros sem parâmetros que podem ser usados para personalizar o prompt via variável PS1:

  • \a : um caractere ASCII de sino (07)
  • \d : a data no formato “Dia da semana mês dia” (por exemplo, “terça-feira 26 de maio”)
  • \D{format} : o formato é passado para o strftime(3) e o resultado é inserido na sequência de prompt; um vazio formato resulta em uma representação de tempo específicos da localidade. As chaves são necessárias
  • \e : um caractere de escape de ASCII (033)
  • \h : nome do host, até o primeiro ‘.’
  • \H : nome do host
  • \j : o número de empregos atualmente administrada pelo shell
  • \l : o nome de base do nome do dispositivo terminal de s de concha
  • \n : newline
  • \r : retorno de carro
  • \s : o nome do shell, o basename $ 0 (a parte após a barra final)
  • \t : a hora atual no formato 24 horas HH
  • \T : a hora atual no formato 12 horas HH
  • \@ : o tempo atual em 12 horas formato am/pm
  • \A : a hora atual no formato 24 horas HH: mm
  • \u : o username do usuário atual
  • \v : a versão do bash (por exemplo, 2,00)
  • \V : o lançamento do bash, versão + patch nível (por exemplo, 2.00.0)
  • \w : o diretório de trabalho atual, com $HOME abreviada com um til
  • \W : o nome base do diretório de trabalho atual, com $HOME abreviada com um til
  • \! : o número de história deste comando
  • \# : o número de comando deste comando
  • \$ : se o UID eficaz é 0, um #, caso contrário um $
  • \nnn : o caractere correspondente a nnn número octal
  • \\ : uma barra invertida
  • \[ : comece uma sequência de caracteres não-imprimíveis, que poderia ser usado para incorporar uma sequência de controle terminal no prompt de
  • \] : fim de uma sequência de caracteres não-imprimíveis

Bater os códigos de Escape de cor

Os seguintes códigos entre de escape \[\e[ e m\] são reconhecidos no texto:

Preto 0;30
Cinza escuro 1;30
Azul 0;34
Azul claro 1;34
Verde 0;32
Luz verde 1;32
Ciano 0;36
Ciano claro 1;36
Vermelho 0;31
Luz vermelha 1;31
Roxo 0;35
Luz roxa 1;35
Brown 0;33
Amarelo 1;33
Cinza-claro 0;37
Branco 1;37

Por exemplo você pode tentar o seguinte 😉

export PS1="\[\e[36;1m\] \[\e[31;1m\]\u\[\033[0m\]@\[\e[34;1m\]\h\[\e[0;30m\] $ "

Comando Prompt do bash

A partir da página de doutor GNU Bash: http://www.gnu.org/software/bash/manual/bashref.html

PROMPT_COMMAND
    If set, the value is interpreted as a command to execute before
    the printing of each primary prompt ($PS1).

PROMPT_COMMAND costumam chamar uma função que pode conter declarações de Brito comum considerando PS1 é limitado para variáveis env e os caracteres especiais, tais como ‘\h’ para hostname. Por excample

function prompt_command {
  export PS1=$(~/bin/bash_prompt)
}
export PROMPT_COMMAND=prompt_command

Aqui está uma citação relevante de Bash Prompt HOWTO:

Festança fornece um ambiente variável chamada PROMPT_COMMAND. O conteúdo dessa variável é executado como um regular comando Bash antes Bash exibe um prompt.

[21:55:01][giles@nikola:~] PS1="[\u@\h:\w]\$ "
[giles@nikola:~] PROMPT_COMMAND="date +%H%M"
2155
[giles@nikola:~] d
bin   mail
2156
[giles@nikola:~]

O que aconteceu acima foi que mudei de PS1 para já não incluir a sequência de escape \t (adicionada em uma seção anterior), então o tempo não era mais uma parte do prompt. Então eu usei date + %H %M para exibir a hora no formato de um gosto melhor. Mas ele aparece em uma linha diferente do que o prompt. Arrumar isto tudo usando eco -n... como mostrado abaixo funciona com Bash 2.0 +, mas parece não funcionar com o Bash 1.14.7: aparentemente o prompt é desenhado de forma diferente, e o método a seguir resulta em sobreposição de texto.

2156
[giles@nikola:~] PROMPT_COMMAND="echo -n [$(date +%H%M)]"
[2156][giles@nikola:~]$
[2156][giles@nikola:~]$ d
bin   mail
[2157][giles@nikola:~]$ unset PROMPT_COMMAND
[giles@nikola:~]

echo -n... controla a saída do comando Data e suprime a nova linha à direita, permitindo que o prompt apareça tudo em uma única linha. No final, eu usei o unset comando para remover a variável de ambiente PROMPT_COMMAND .

 

Criando o prompt de utilizável em ksh

shell ksh não tem macros para prompt de… então você precisa de um prompt de utilizável de script. Para Solaris, um muito simplista pode parecer com:

case `/usr/xpg4/bin/id -u` in
0) PS1=" [1m [31m\$HOST:\$PWD\# [0m" ;;
*) PS1="\$LOGNAME\@\$HOST:\$PWD\$ " ;;
esac
PS2='>'
export PS1 PS2

É mais simples em BASH gerar # para root: \ $ é uma macro de bash prompt que se expande para # se o UID eficaz é 0 e $ caso contrário. Que significa isso equivalente Bash prompt (mas sem esquema de cores) pode ser algo como

Ps1=”\u@\h:\w\ \ \ $”  

Em versões mais recentes do bash \w também executa o diretório home de dobramento. Eu não sei como a imitá-lo corretamente em ksh93. Provavelmente, funções de disciplina podem fazer o truque.

Em versões mais recentes do bash \w também realiza a dobradura do diretório home

Em ksh93 você pode tentar para truncar o prompt no caso o diretório atual é um subdiretório do diretório home. ksh93 introduzida ${parameter/pattern/string} substituição que mais tarde foi replicado por BASH e que pode ser usado para o tipo de diretório dobradura como no exemplo a seguir:

PS1='$LOGNAME\@\$HOST:\$PWD\${PWD#$OLDPWD/}$ '

Aqui estão as citações relevantes de documentação bash e ksh93:

ksh93:

${parâmetro /pattern /string}

${parâmetro //pattern /string}

${parâmetro /#pattern /string}

${parâmetro /%pattern /string}

Expande o parâmetro e substitui a mais longa partida de padrão com o dado cadeia de caracteres. Cada ocorrência do \n na sequência é substituído pelo parte do parâmetro que corresponde o n -ésima sub padrão. Na primeira forma, apenas a primeira ocorrência do padrão é substituída. Na segunda forma, cada partida para padrão é substituída pela determinado cadeia de caracteres. A terceira forma restringe a correspondência de padrão para o início da sequência de caracteres, enquanto a quarta forma restringe a correspondência de padrão para o final da sequência de caracteres. Quando a sequência de caracteres é nulo, o padrão será excluído e o / na frente de sequência de caracteres pode ser omitido. Quando o parâmetro é @, *, ou uma matriz variável com subscrito @ ou *, a operação de substituição é aplicada a cada elemento por sua vez.

bash:

${parameter//pattern/string}O pattern é expandida para produzir um padrão como na expansão de nome de arquivo. Parameter é expandida e a mais longa partida de pattern contra seu valor é substituída com a string. Na primeira forma, apenas o primeiro jogo é substituído. A segunda forma faz com que todas as correspondências do pattern a ser substituído com a string. Se o pattern começa com `#’, ele deve corresponder no início do valor do parameterexpandido. Se o pattern começa com `%’, ele deve corresponder ao final do valor do parameterexpandido. Se a string é nula, fósforos do pattern são excluídos e a / seguindo pattern pode ser omitido. Se parameter é `@’ ou `*’, a operação de substituição é aplicada a cada parâmetro posicional, por sua vez, e a expansão é a lista resultante. Se o parameter é uma variável de matriz subscrita com `@’ ou `*’, a operação de substituição é aplicada a cada membro da matriz, por sua vez, e a expansão é a lista resultante.

Mas o problema é que barras como expansão de $HOME são interpretadas como delimitador de substituição (“/”), assim a seguinte ideia não funciona (Solaris segue de exemplo):

case `/usr/xpg4/bin/id -u` in
0) PS1=" [1m [31m\$LOGNAME\@\$HOST:\${PWD/#$HOME/~}\# [0m" ;;
*) PS1="\$LOGNAME\@\$HOST:\${PWD/#$HOME/~}\$ " ;;
esac
PS2='>'
export PS1 PS2

Paradoxalmente a seguir funciona corretamente mas simplesmente apagar o diretório home, sem substituição então isso não é muito útil:

case `/usr/xpg4/bin/id -u` in
0) PS1=" [1m [31m\$LOGNAME\@\$HOST:\${PWD#$HOME}\# [0m" ;;
*) PS1="\$LOGNAME\@\$HOST:\${PWD#$HOME}\$ " ;;
esac
PS2='>'
export PS1 PS2

Boa sorte com seus próprios experimentos de prompt de shell ksh93 e escreva-me se você conseguir fazer este truque em ksh93 corretamente!

 

Anúncios