Quais são alguns prompts informativos e úteis do shell? (Bash, csh, ksh, etc.)

8

Uma das minhas dicas favoritas do Terminal do Mac OS X envolve adicionar o último processo em execução ao título do terminal usando o seguinte código no seu .bashrc .

trap 'printf "\033]0;  `history 1 | cut -b8-`  \007"' DEBUG

Agora, estou procurando personalizar meu prompt do Bash do padrão para algo mais funcional. Quais são alguns exemplos úteis de prompt de shell?

Dave K
fonte

Respostas:

6

Eu uso uma simples linha dupla:

[\w]\n\u@\h>

ou

[\w]\n\u@\h#

se raiz. As pessoas olham para mim como se eu fosse louco por usar um prompt de duas linhas, mas eu odeio apenas ver a última parte do caminho atual e trabalho com caminhos que são longos demais para colocar tudo na mesma linha que o área de entrada.

caos
fonte
Então, eu devo ser louco por usar um prompt de 3 linhas, lol.
527 Ivan
7

Eu tenho um script ~/bin/setpromptque é executado pelo meu .bashrc, que contém:

RESET="\[\017\]"
NORMAL="\[\033[0m\]"
RED="\[\033[31;1m\]"
YELLOW="\[\033[33;1m\]"
WHITE="\[\033[37;1m\]"
SMILEY="${WHITE}:)${NORMAL}"
FROWNY="${RED}:(${NORMAL}"
SELECT="if [ \$? = 0 ]; then echo \"${SMILEY}\"; else echo \"${FROWNY}\"; fi"

# Throw it all together 
PS1="${RESET}${YELLOW}\h${NORMAL} \`${SELECT}\` ${YELLOW}>${NORMAL} "

Este script define o prompt como o nome do host seguido por :)se o último comando foi bem-sucedido e :(se o último comando falhou.

Eddie
fonte
4

Este, no entanto, é o mais impressionante que eu já vi:

PS1='\[\033[0m\]\[\033[0;31m\].:\[\033[0m\]\[\033[1;30m\][\[\033[0m\]\[\033[0;28m\]Managing \033[1;31m\]\j\[\033[0m\]\[\033[1;30m\]/\[\033[0m\]\[\033[1;31m\]$(ps ax | wc -l | tr -d '\'' '\'')\[\033[0m\]\[\033[1;30m\] \[\033[0m\]\[\033[0;28m\]jobs.\[\033[0m\]\[\033[1;30m\]] [\[\033[0m\]\[\033[0;28m\]CPU Load: \[\033[0m\]\[\033[1;31m\]$(temp=$(cat /proc/loadavg) && echo ${temp%% *}) \[\033[0m\]\[\033[0;28m\]Uptime: \[\033[0m\]\[\033[1;31m\]$(temp=$(cat /proc/uptime) && upSec=${temp%%.*} ; let secs=$((${upSec}%60)) ; let mins=$((${upSec}/60%60)) ; let hours=$((${upSec}/3600%24)) ; let days=$((${upSec}/86400)) ; if [ ${days} -ne 0 ]; then echo -n ${days}d; fi ; echo -n ${hours}h${mins}m)\[\033[0m\]\[\033[1;30m\]]\[\033[0m\]\[\033[0;31m\]:.\n\[\033[0m\]\[\033[0;31m\].:\[\033[0m\]\[\033[1;30m\][\[\033[0m\]\[\033[1;31m\]$(ls -l | grep "^-" | wc -l | tr -d " ") \[\033[0m\]\[\033[0;28m\]files using \[\033[0m\]\[\033[1;31m\]$(ls --si -s | head -1 | awk '\''{print $2}'\'')\[\033[0m\]\[\033[1;30m\]] [\[\033[0m\]\[\033[1;31m\]\u\[\033[0m\]\[\033[0;31m\]@\[\033[0m\]\[\033[1;31m\]\h \[\033[0m\]\[\033[1;34m\]\w\[\033[0m\]\[\033[1;30m\]]\[\033[0m\]\[\033[0;31m\]:.\n\[\033[0m\]\[\033[0;31m\].:\[\033[0m\]\[\033[1;30m\][\[\033[0m\]\[\033[1;31m\]\t\[\033[0m\]\[\033[1;30m\]]\[\033[0m\]\[\033[0;31m\]:. \[\033[0m\]\[\033[1;37m\]$ \[\033[0m\]'

Experimente. Ele fornece boas informações, mas na verdade fará com que a carga em suas caixas aumente apenas pressionando Enter rapidamente!

Glen Solsberry
fonte
11
hah, muito impressionante!
Dave K
Parece bom, mas não funciona na minha caixa de FreeBSD :(
Eugene Yarmash
@ yugene y: Alguns desses caminhos provavelmente não estão nas caixas do FreeBSD ...
Glen Solsberry
Assustador, mas impressionante!
siliconpi
3

Sou fã do prompt padrão do Cygwin bash:

PS1='\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n\$ '

ou sem cores:

PS1='\n\u@\h \n\$ '

parece:

username@hostname
$ ls -l
Spoulson
fonte
2

Eu gosto de incluir o tempo no meu. Dá-me uma espécie de construído em timetorno de meus comandos:

PS1="[\t \u@\h:\w]$ "

Embora depois de ver alguns deles, faça-me querer tornar o meu um pouco mais inteligente!

Glen Solsberry
fonte
2

Aqui está o meu (role para a direita para ver um pouco mais interessante):

'-------------------------------------------------------------------------------\n${debian_chroot:+($debian_chroot)}[\w]\n\u@\h\[\033[1;33m\]\[\033[0m\]($(__git_ps1 "%s")$(parse_git_dirty))$ 

Aqui está o resultado:

-------------------------------------------------------------------------------
[~]
user@host()$ 

Quando estou dentro de um repositório Git :

-------------------------------------------------------------------------------
[~/path_to_repo]
user@host(master)$ 

Eu escolho usar várias quebras de linha e a "régua horizontal" para facilitar a verificação de buffers, e os nomes de caminho longos não empurram o cursor muito para a direita.

Ivan
fonte
1

Em ksh:

No meu .profile, defino o seguinte var (portanto, esse var é definido apenas uma vez por sessão, não importa quantos sus eu faça:

PCH=\>

No meu .kshrc eu tenho:

if let "${SPID:-0} != $$"; then
    PCHS="$PCHS$PCH"
fi

Tornei-me root com o seguinte alias, em vez de "su" (o kroot é um usuário root com um shell ksh em vez de sh (solaris) ou bash (linux):

alias root='PCH=\# su -m kroot'
alias me="PCH=\> su -m $USER"

Eu também defini essas duas funções:

function lprompt {
  PS1=$HOST' $? $PWD '"$PCHS "
}
function sprompt {
  PS1='$?":"${PWD##*/}'"$PCHS "
}

e finalmente no final de .kshrc eu tenho:

lprompt

Tudo isso me fornece, por padrão, a configuração automática do final do meu prompt para indicar se sou ou não root (e, por sua vez, se tenho um pai que era root), diretório de trabalho atual, nome do host e status de saída do último processo. sprompt elimina o nome do host, reduz o caminho até o nome da base e remove os espaços:

g3 0 /home/jj33 > expr 1 / 0
expr: division by zero
g3 2 /home/jj33 > expr 1 / 1
1
g3 0 /home/jj33 > root
Password: 
g3 0 /home/jj33 ># me
g3 0 /home/jj33 >#> ^D
g3 0 /home/jj33 ># sprompt
0:jj33># me
g3 0 /home/jj33 >#> sprompt
0:jj33>#>expr 1 / 0
expr: division by zero
2:jj33>#>

Os aliases root / me são da administração pré-sudo no Solaris e os velhos hábitos morreram muito. Duvido que alguém possa implementar exatamente a mesma coisa nos dias de hoje. As funções de mudança imediata e o status existente continuam sendo muito valiosas para mim.

jj33
fonte
1

Eu tenho um prompt que é simples, mas usa cores para fornecer algumas informações extras:

drewble:~$ 

A cor do nome do host (drewble, neste caso) é diferente em cada máquina - quando recebo uma nova máquina na qual trabalho, escolho uma cor arbitrária para essa máquina. Dessa forma, quando tenho muitos terminais abertos, é fácil saber em qual máquina eles estão inseridos no SSH e reduz os erros que cometi ao estar na máquina errada. Além disso, quando o faço sudo -s, coloco o nome do host em maiúsculas e ponho o vermelho em dois pontos, novamente, isso reduz os erros, deixando claro que você está agindo como raiz. O caminho (meu diretório pessoal, ~neste caso) está em verde brilhante, o que ajuda a separar linhas de saída; se algo cria muita saída, é fácil rolar para cima e ver onde a saída começou.

# Color the hostname
HOSTNAME=`hostname|sed -e 's/\..*$//'`
if [ $HOSTNAME = 'Caligula' ] || [ $HOSTNAME = 'Caligula.local' ]; then
    export HOST_COLOR="\[\033[1;35m\]"
fi
if [ $HOSTNAME = 'drewble' ]; then
    export HOST_COLOR="\[\033[1;34m\]"
fi
if [ $HOSTNAME = 'davinci' ]; then
    export HOST_COLOR="\[\033[1;31m\]"
fi

# Color the colon red & capitalize hostname if root
COLON_COLOR='0m'
if [ ${UID} -eq 0 ]; then
    COLON_COLOR='1;31m'
fi
if [ ${UID} -eq 0 ]; then
    HOSTNAME="`echo $HOSTNAME|tr '[a-z]' '[A-Z]'`"
fi

# Set the actual prompt
PS1=`echo -ne "$HOST_COLOR$HOSTNAME\[\033[00m\]\[\e[$COLON_COLOR\]:\[\033[01;32m\]\w\[\033[00m\]\\[\033[01;33m\]\$\[\033[00m\] "`
Drew Stephens
fonte
1

Não é um prompt de shell, mas é uma personalização que pode se encaixar no espírito do que você está perguntando.

Defino a seguinte variável de ambiente:

if [ -z "$PROMPT_COMMAND" ]; then
    export PROMPT_COMMAND='history -a'
else
    export PROMPT_COMMAND="history -a;$PROMPT_COMMAND"
fi

Dessa forma, se eu tiver vários terminais abertos via tela ou qualquer outra coisa, não perderei a história quando eles tropeçarem nas mudanças dos outros.

deinspanjer
fonte
1
  export PS1="\[`if [[ $? = 0 ]]; then echo '\e[32m\h\e[0m'; else echo '\e[31m\h\e[0m' ; fi`:\w\n$ "

Isso exibe:

hostname:~
$ 

Com 'hostname' em verde se o último código de retorno do comando executado for '0' e vermelho se for> '0'.

jtimberman
fonte
1

Semelhante à resposta do caos , eu meio que gosto

\u@\h:\w\n\u@\h:\$

o que me dá

root@host-10548:/var/www/site.org
root@host-10548:$

Ao incluir o usuário / host na primeira linha, posso copiar facilmente toda a linha do caminho quando estiver usando o SCP ou rsync para enviar alguns arquivos para esse diretório.

Zoredache
fonte
Excelente ideia. Posso ver que o caminho completo do scp é muito útil. A segunda linha pode ser aprimorada adicionando o tempo sugerido pelo gms8994.
58560 Dave K
0

Para bash eu gosto

PS1 = "\ h \ d \ t \ w \ n \ u>"

o que resulta em:

myserver Seg Set 07 07:43:11 / u08
root>

Assim, você obtém o nome do host, a data e a hora, o caminho completo e o nome de usuário em uma nova linha, com o prompt. Isso é para minimizar a quebra de linha nos diretórios. Estou dentro e fora das caixas o dia todo, então tudo o que posso fazer para mantê-lo reto é bom. Eu também tenho o putty definido para registrar tudo. Posso voltar e olhar os logs e ver exatamente o que estava fazendo quando. Também é útil para descobrir sequências de eventos em várias janelas do terminal ao mesmo tempo.

Ronald Pottol
fonte
0

Meu prompt normal é

\u@\h $PWD $WINDOW [$?] \$

Isso me fornece o usuário atual, o diretório atual do host atual ( sem substituir $ HOME por ~), a screenjanela atual e o último retorno de erro. Como normalmente tenho 16 ou mais janelas de tela abertas, saber que a atual é útil.

staticsan
fonte
0

Meu prompt do zsh:

[andrew@hostname ~]%

Normalmente, é vermelho e branco com o diretório atual em rosa. Se o root for cinza escuro, com o nome do host em vermelho. Se $?não for 0, o% final será mostrado em vermelho.

function precmd {

   ERR=$?

   if [ $UID -eq 0 ]; then
       MYPROMPT="$(print '%{\e[1;30m%}[%{\e[0m%}')$(print '%{\e[1;31m%}%n%{\e[0m%}')@$(print '%{\e[1;31m%}%m%{\e[0m%}') $(print '%{\e[1;35m%}%3c%{\e[0m%}')$(print '%{\e[1;30m%}]%{\e[0m%}')"
   else
       MYPROMPT="[$(print '%{\e[1;31m%}%n%{\e[0m%}')@%m $(print '%{\e[1;35m%}%3c%{\e[0m%}')]"
   fi

   if [ $ERR -ne 0 ]; then
       ERROR="$(print '%{\e[1;31m%}%#%{\e[0m%}') "
       export PS1=$MYPROMPT$ERROR
   else
       export PS1="$MYPROMPT%# "
   fi

   export RPS1=""
}
theotherreceive
fonte