¿Cuáles son algunos avisos de shell informativos y útiles? (Bash, csh, ksh, etc.)

8

Uno de mis consejos favoritos para el terminal Mac OS X consiste en agregar el último proceso en ejecución en el título del terminal usando el siguiente código en su .bashrc .

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

Ahora estoy buscando personalizar mi solicitud Bash del valor predeterminado en algo más funcional. ¿Cuáles son algunos ejemplos útiles de indicador de shell?

Dave K
fuente

Respuestas:

6

Yo uso un simple dos líneas:

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

o

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

si root. La gente me mira como si estuviera loca por usar un indicador de dos líneas, pero odio solo ver la última parte de la ruta actual, y trabajo con rutas que son demasiado largas para poner todo en la misma línea que el área de entrada.

caos
fuente
Así que debo estar loco por usar un mensaje de 3 líneas, jajaja.
Ivan
7

Tengo un guion ~/bin/setprompt que ejecuta my .bashrc, que contiene:

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} "

Esta secuencia de comandos establece la solicitud con el nombre de host seguido de :)si el último comando fue exitoso y :(si el último comando falló.

Eddie
fuente
4

Este, sin embargo, es el más increíble que he visto:

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\]'

Dale un tiro. Da buena información, ¡pero en realidad hará que la carga en sus cajas aumente simplemente presionando enter en un aviso!

Glen Solsberry
fuente
1
ja, muy impresionante!
Dave K
Se ve bien, pero no funciona en mi cuadro de freebsd :(
Eugene Yarmash
@eugene y: Algunos de esos caminos probablemente no están en los cuadros de FreeBSD ...
Glen Solsberry
Asustadizo, ¡pero impresionante!
siliconpi
3

Soy fanático del indicador predeterminado de Cygwin bash:

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

o sin colores:

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

parece:

username@hostname
$ ls -l
Spoulson
fuente
2

Me gusta incluir el tiempo en el mío. Me da una especie de construido entime alrededor de mis comandos:

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

Aunque después de ver algunos de estos, ¡me dan ganas de hacer que el mío sea un poco más inteligente!

Glen Solsberry
fuente
2

Aquí está el mío (desplácese hacia la derecha para ver un poco más interesante):

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

Aquí está el resultado:

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

Cuando estoy dentro de un repositorio de Git :

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

Elijo usar múltiples saltos de línea y la "regla horizontal" para facilitar el escaneo de los buffers, y así los nombres de ruta largos no empujan el cursor demasiado a la derecha.

Ivan
fuente
1

En ksh:

En mi .profile, configuré la siguiente var (por lo que esta var solo se establece una vez por sesión, sin importar cuántas sumas haga:

PCH=\>

En mi .kshrc tengo:

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

Me convierto en root con el siguiente alias, en lugar de "su" (kroot es un usuario root con un shell ksh en lugar de sh (solaris) o bash (linux):

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

También he definido estas dos funciones:

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

y finalmente al final de .kshrc tengo:

lprompt

Todo esto me da por defecto la configuración automática del final de mi solicitud para indicar si soy o no root (y, a su vez, si tengo un padre que era root), el directorio de trabajo actual, el nombre de host y el estado de salida del último proceso. sprompt elimina el nombre de host, reduce la ruta solo al nombre base y elimina espacios:

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>#>

Los alias raíz / me provienen de la administración previa a sudo en Solaris y los viejos hábitos han muerto duramente. Dudo que alguien implemente exactamente lo mismo en estos días. Las funciones de cambio rápido y el estado existente siguen siendo muy valiosas para mí.

jj33
fuente
1

Tengo un mensaje que es simple, pero usa colores para dar información adicional:

drewble:~$ 

El color del nombre de host (dibujable, en este caso) es diferente en cada máquina: cuando obtengo una nueva máquina en la que trabajo, elijo un color arbitrario para esa máquina. De esa manera, cuando tengo muchos terminales abiertos, es fácil saber en qué máquina están SSHed y reduce los errores que cometo al estar en la máquina equivocada. Además, cuando lo hago sudo -s, pongo el nombre de host en mayúsculas y coloreo los dos puntos de rojo, nuevamente, esto reduce los errores al dejar en claro que estás actuando como root. La ruta (mi directorio de inicio, ~en este caso) está en verde brillante, lo que ayuda a separar las líneas de salida; Si algo crea mucha salida, es fácil desplazarse hacia arriba y ver dónde comenzó la salida.

# 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
fuente
1

No es un indicador de comandos de shell, pero es una personalización que puede ajustarse al espíritu de lo que está preguntando.

Establezco la siguiente variable de entorno:

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

De esta manera, si tengo múltiples terminales abiertas a través de la pantalla o lo que sea, no perderé el historial cuando se cambien entre sí.

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

Esto muestra:

hostname:~
$ 

Con 'hostname' en verde si el último código de retorno del comando ejecutado fue '0' y rojo si fue> '0'.

jtimberman
fuente
1

Similar a la respuesta del caos , me gusta

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

lo que me da

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

Al incluir el usuario / host en la primera línea, puedo copiar fácilmente esa línea de ruta completa cuando estoy usando SCP , o rsync para enviar algunos archivos a ese directorio.

Zoredache
fuente
Excelente idea. Puedo ver que la ruta scp completa es muy útil. La segunda línea podría mejorarse agregando el tiempo sugerido por gms8994.
Dave K
0

Para bash me gusta

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

lo que resulta en:

myserver lun sep 07 07:43:11 / u08
root>

Entonces obtienes el nombre de host, la fecha y la hora, la ruta completa y luego el nombre de usuario en una nueva línea, con el mensaje. Eso es para minimizar el ajuste de línea en los directorios. Estoy dentro y fuera de las cajas todo el día, así que todo lo que puedo hacer para mantenerlo en orden es bueno. También tengo masilla configurada para registrar todo. Puedo regresar y mirar los registros, y ver exactamente qué estaba haciendo cuando. También es útil para descubrir secuencias de eventos en varias ventanas de terminal a la vez.

Ronald Pottol
fuente
0

Mi aviso normal es

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

Esto me da el usuario actual, el directorio actual del host actual ( sin reemplazar $ HOME con ~), la screenventana actual y el último error devuelto. Como normalmente tengo 16 o más ventanas de pantalla abiertas, conocer la actual es útil.

staticsan
fuente
0

Mi indicador de zsh:

[andrew@hostname ~]%

Normalmente, es rojo y blanco con el directorio actual en rosa. Si es root, entonces es gris más oscuro con el nombre de host en rojo. Si $?no es 0, el% final se muestra en rojo.

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=""
}
el otro recibir
fuente