linux - tiene - ¿Cuál es tu guía favorita de Bash?
shell script (14)
Aquí está el mío.
# this prompt will show the hostname in green if the last command returned 0,
# otherwise it will be red.
PS1="/[/`if [[ /$? = "0" ]]; then echo ''/e[32m/h/e[0m''; else echo ''/e[31m/h/e[0m'' ; fi/`:/w/n/$
Parece que esta ''computadora portátil'' es verde y el resto es primer plano de la terminal por defecto, por supuesto.
laptop:~/bin
$
¿Cuáles son algunos elementos en tu prompt favorito de Bash?
Me gusta tener un indicador del éxito del comando más reciente, como por ejemplo (en .bashrc
):
function exitstatus {
EXITSTATUS="$?"
BOLD="/[/033[1m/]"
RED="/[/033[1;31m/]"
GREEN="/[/e[32;1m/]"
BLUE="/[/e[34;1m/]"
OFF="/[/033[m/]"
PROMPT="[/u@/h ${BLUE}/W${OFF}"
if [ "${EXITSTATUS}" -eq 0 ]
then
PS1="${PROMPT} ${BOLD}${GREEN}:)${OFF} ]/$ "
else
PS1="${PROMPT} ${BOLD}${RED}:(${OFF} ]/$ "
fi
PS2="${BOLD}>${OFF} "
}
PROMPT_COMMAND=exitstatus
Como salto entre varias máquinas diferentes durante todo el día, mi estación de trabajo dev, servidores de desarrollo y entornos de ensayo, he tomado la coloración del nombre de la máquina en mis instrucciones con el siguiente fragmento para dar un indicador visual cuando miro el mar de términos en mis monitores a qué máquinas están conectadas:
# Color the hostname
if [ $HOSTNAME = ''claudius'' ]; then
export HOST_COLOR="/[/033[1;36m/]"
fi
if [ $HOSTNAME = ''drooble'' ]; then
export HOST_COLOR="/[/033[1;34m/]"
fi
if [ $HOSTNAME = ''davinci'' ]; then
export HOST_COLOR="/[/033[1;31m/]"
fi
# Color the colon red if root
COLON_COLOR=''0m''
if [ ${UID} -eq 0 ]; then
COLON_COLOR=''1;31m''
fi
Luego, la variable PS1 completa con el nombre de host coloreado, dos puntos (rojo si es raíz, es decir sudo -s) y ruta completa:
PS1=`echo -ne "$HOST_COLOR/h/[/033[00m/]/[/e[$COLON_COLOR/]:/[/033[01;32m/]/w/[/033[00m/]//[/033[01;33m/]/$/[/033[00m/] "`
Eche un vistazo a " Usuarios de Bash: ¿Qué tiene para su $ PS1? " Para obtener una gran cantidad de ejemplos.
El mío, en casa, es bastante simple:
[user@machinename:/full/CWD]$
En el trabajo, tenemos un concepto de ''entornos'' para los usuarios de producción y prueba, y el mensaje es
(env;sub-env) [user@machinename:/full/CWD]$
He tenido esto como mi sugerencia de bash durante mucho tiempo:
PS1="(/d /t) (/u@/h:/w)/nbash> " export PS1
Me gusta el aviso para decir aproximadamente cuánto tiempo tardó en ejecutarse el comando anterior. Me gusta esto:
0:007 /home/jcl 0$ sleep 1
1:012 /home/jcl 0$
Se puede implementar de esta manera:
bold=''/[/e[1m/]''
plain=''/[/e[0m/]''
set_begin()
{
if [ -z "$begin" ]
then
begin="$(date +"%s %N")"
fi
}
calc_elapsed()
{
read begin_s begin_ns <<< "$begin"
begin_ns="${begin_ns##+(0)}"
# PENDING - date takes about 11ms, maybe could do better by digging in
# /proc/$$.
read end_s end_ns <<< $(date +"%s %N")
end_ns="${end_ns##+(0)}"
local s=$((end_s - begin_s))
local ms
if [ "$end_ns" -ge "$begin_ns" ]
then
ms=$(((end_ns - begin_ns) / 1000000))
else
s=$((s - 1))
ms=$(((1000000000 + end_ns - begin_ns) / 1000000))
fi
elapsed="$(printf " %2u:%03u" $s $ms)"
if [ "$s" -ge 300 ]
then
elapsed="$elapsed [$(human_time $s)]"
fi
}
human_time()
{
local s=$1
local days=$((s / (60*60*24)))
s=$((s - days*60*60*24))
local hours=$((s / (60*60)))
s=$((s - hours*60*60))
local min=$((s / 60))
if [ "$days" != 0 ]
then
local day_string="${days}d "
fi
printf "$day_string%02d:%02d/n" $hours $min
}
timer_prompt()
{
status=$?
local size=16
calc_elapsed
if [ "${#PWD}" -gt $size ]
then
pwd_string="${PWD: -$size}"
else
pwd_string="$(printf "%${size}s" $PWD)"
fi
PS1="$bold$elapsed $pwd_string $status//$ $plain"
begin=
}
set_begin
trap set_begin DEBUG
PROMPT_COMMAND=timer_prompt
Me gusta esto:
/[/033[33m/][/u@/[/033[1;31m/]/h]/]/033[0m {/W}/n/033[1;34m/]/w/]/033[0m >
pone
[name]@[hostname]
[pwd] >
con [name]
en amarillo, [hostname]
en rojo y [pwd]
en azul
Me gusta mantenerlo (relativamente) simple:
username @ hostname: / full / path>
PS1=''/u@/h:/w> ''
export PS1
Mi mensaje:
[Vie 19 de septiembre a las 10:33 a.m.]
[nat @ Forge ~] $
#################################3
## File used for defining $PS1
bash_prompt_command() {
# How many characters of the $PWD should be kept
local pwdmaxlen=25
# Indicate that there has been dir truncation
local trunc_symbol=".."
local dir=${PWD##*/}
pwdmaxlen=$(( ( pwdmaxlen < ${#dir} ) ? ${#dir} : pwdmaxlen ))
NEW_PWD=${PWD/#$HOME//~}
local pwdoffset=$(( ${#NEW_PWD} - pwdmaxlen ))
if [ ${pwdoffset} -gt "0" ]
then
NEW_PWD=${NEW_PWD:$pwdoffset:$pwdmaxlen}
NEW_PWD=${trunc_symbol}/${NEW_PWD#*/}
fi
}
bash_prompt() {
local NONE="/[/033[0m/]" # unsets color to term''s fg color
# regular colors
local K="/[/033[0;30m/]" # black
local R="/[/033[0;31m/]" # red
local G="/[/033[0;32m/]" # green
local Y="/[/033[0;33m/]" # yellow
local B="/[/033[0;34m/]" # blue
local M="/[/033[0;35m/]" # magenta
local C="/[/033[0;36m/]" # cyan
local W="/[/033[0;37m/]" # white
# empahsized (bolded) colors
local EMK="/[/033[1;30m/]"
local EMR="/[/033[1;31m/]"
local EMG="/[/033[1;32m/]"
local EMY="/[/033[1;33m/]"
local EMB="/[/033[1;34m/]"
local EMM="/[/033[1;35m/]"
local EMC="/[/033[1;36m/]"
local EMW="/[/033[1;37m/]"
# background colors
local BGK="/[/033[40m/]"
local BGR="/[/033[41m/]"
local BGG="/[/033[42m/]"
local BGY="/[/033[43m/]"
local BGB="/[/033[44m/]"
local BGM="/[/033[45m/]"
local BGC="/[/033[46m/]"
local BGW="/[/033[47m/]"
local UC=$W # user''s color
[ $UID -eq "0" ] && UC=$R # root''s color
# without colors: PS1="[/u@/h /${NEW_PWD}]//$ "
# extra backslash in front of /$ to make bash colorize the prompt
#Nat''s Colored Prompt
PS1="${EMK}/n[${EMR}/d ${EMR}/@${EMK}] /n${EMK} [${UC}/u${EMK}@${UC}/h ${EMB}/${NEW_PWD}${EMK}]${UC}//$ ${NONE}"
}
PROMPT_COMMAND=bash_prompt_command
bash_prompt
unset bash_prompt
Modifiqué un poco el ejemplo del póster original:
function exitstatus {
EXITSTATUS="$?"
BOLD="/[/033[1m/]"
RED="/[/033[0;31m/]"
GREEN="/[/e[0;32m/]"
BLUE="/[/e[34m/]"
OFF="/[/033[m/]"
HOST="/h"
USER="/u"
DIR="/w"
NEWLINE="/n"
DATE="/d"
TIME="/t"
PROMPT="/[/033]0;${USER}@${HOST}: /w/007/n${RED}${TIME} ${DATE} [${USER}@${HOST}:[${BLUE}/w${RED}]"
if [ "${EXITSTATUS}" -eq 0 ]
then
PS1="${PROMPT} [${GREEN}${EXITSTATUS}${RED}]${OFF}/n$ "
else
PS1="${PROMPT} [${BOLD}${EXITSTATUS}${RED}]${OFF}/n$ "
fi
PS2="${BOLD}>${OFF} "
}
PROMPT_COMMAND=exitstatus
Utilizo una versión personalizada de la solicitud " Agregar información de VCS en el prompt de bash " de Glandium.org. Lo más grande que hice fue sacar los bits de la colección VCS en un script separado.
Este mensaje es excelente porque me brinda mucha información que necesito saber sobre el proyecto actual en el que estoy trabajando, basado en información de VCS. También he personalizado el mío para mostrar resultados de devolución de comandos, número de ventana de pantalla, nombres de usuario y máquina, y la hora actual. Es bastante largo (42 caracteres o más) pero uso terminales anchos, así que no es gran cosa.
Por ejemplo, mi solicitud actual (después de un poco de edición) se ve así:
[0-1]michael@hal(g:proj1[topic/fix-123]app)[10:50]|$
Lo que significa que el último comando tuvo un resultado de 0, en la ventana de pantalla 1, cuando Michael se conectó a hal. El directorio actual es un directorio de trabajo de Git para proj1, dentro del tema de rama / fix-123 en la aplicación de directorio a las 10:50 a.m. Iniciado sesión como un usuario normal.
Por cierto, si alguien quisiera mi guión personalizado, por favor avíseme ... Me complacerá ponerlo aquí o en otro lugar de fácil acceso.
en .bashrc:
PS1=''/$ ''
(H / T @bitmask para la edición)
mía:
function prompt_err {
if test "$?" -eq 0; then PS1='': /W$; ''; else PS1='': /W [ERROR#$?]$; ''; fi
}
PROMPT_COMMAND=prompt_err
PS2='' ''
Hace:
- mostrar el nombre del directorio
- permite copiar / pegar toda la línea en otro shell para volver a ejecutar el mismo comando, ignorando el aviso
- si el estado de salida del comando anterior no era 0, imprima un ERROR visible con código de estado
- prompt secundario son espacios para permitir copiar / pegar
PS1="/n/e[30;1mUSER ( /e[0m/e[33;1m/w/e[0m/e[30;1m )/e[0m/e[33;33m/n$ /e[0m"