Mostrar solo el nombre del directorio actual (no la ruta completa) en la solicitud de bash

71

La forma en que mi indicador bash está configurado actualmente, muestra la ruta completa al directorio actual. Esto es molesto cuando estoy dentro de un árbol de directorios, ya que el mensaje se vuelve tan largo que cada comando se ajusta a la siguiente línea. ¿Cómo hago que muestre solo la última parte del camino?

Esto es lo que tengo en mi .bashrc:

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
    PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD/$HOME/~}\007"'
    ;;
*)
    ;;
esac
hsribei
fuente

Respuestas:

98

Cambie el \w(minúscula) a \W(mayúscula):

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\W\[\033[00m\]\$ '
                                                                                       ^^
           this one waaaaaay over here ------------------------------------------------+    

Eche un vistazo al Bash Prompt HOWTO para ver muchos detalles divertidos. ejemplo:

user@host:/usr/local/bin$ echo $PS1
${debian_chroot:+($debian_chroot)}\[\033[01;31m\]\u@\h\[\033[00m\]:\[\033[01;36m\]\w\[\033[00m\]\$ 

user@host:/usr/local/bin$ export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;31m\]\u@\h\[\033[00m\]:\[\033[01;36m\]\W\[\033[00m\]\$ '

user@host:bin$

La PROMPT_COMMANDvariable, si está establecida, es un comando que se ejecuta antes de mostrar la solicitud especificada en PS1. En su caso, PROMPT_COMMANDejecuta una echodeclaración con ciertas secuencias de escape ANSI que manipulan la barra de título de un Xterm .

Si sospecha que PROMPT_COMMANDestá anulando su PS1solicitud, puede unsethacerlo y probar las cosas:

$ unset PROMPT_COMMAND

Finalmente, asegúrese de cambiar la PS1definición que realmente se usa. Los lugares comunes son /etc/bash.bashrc, /etc/profile, ~/.bashrc, ~/.bash_profile, ~/.profile. Los archivos del sistema generalmente se ejecutan (pero no siempre) antes que los archivos del usuario.

quijote curandero
fuente
Hm ... me temo que ya es \ w, pero parece que esa casedeclaración lo anula cuando estoy en una xterm, y el problema parece estar PWDen la PROMPT_COMMANDlínea. ¿Sabes lo que debería poner allí?
hsribei
44
\w(minúscula) lo establece en la ruta completa, \W(mayúscula) se recorta al bit final. PROMPT_COMMAND está configurando el título de la ventana en un xterm. verifique su variable TERM; si no comienza con "xterm" o "rxvt", PROMPT_COMMAND ni siquiera se está ejecutando.
quack quijote
Oh si, duh. Lo siento, mezclé mayúsculas y minúsculas. Eso funciono. ¡Gracias! :)
hsribei
Gran respuesta. Asegúrese de reiniciar para que esto surta efecto. ¡Gracias!
Combinar
14

El comando simple bash replace es

${VAR/pattern_to_find/pattern_to_replace}

Para mostrar el último directorio que puede hacer ${PWD/*\//}, es decir, encontrar cualquier cosa antes e incluir el último ' /' y reemplazarlo por nada.

En mi máquina ubuntu utilizo:

export PS1='$(whoami):${PWD/*\//}#'. 
stopBugs
fuente
1
Me gusta esta respuesta mejor que la aceptada porque es genérica para cualquier situación en lugar de solo la lógica de análisis especial de $ PS1. Menos herramientas más potentes son más fáciles de recordar y componer. :)
David Ellis
4

Mi solución es mostrar los tres directorios superiores e inferiores 2 cuando hay más de 5

Entonces mi aviso (que también tiene otra información) se ve así:

08:38:42 durrantm U2017 /home/durrantm/Dropbox/_/rails/everquote

cuando mi pwd es en realidad

/home/durrantm/Dropbox/93_2016/work/code/ruby__rails/rails/everquote

Mi indicador de PS1 se configura de la siguiente manera:

HOST='\[\033[02;36m\]\h'; HOST=' '$HOST
TIME='\[\033[01;31m\]\t \[\033[01;32m\]'
LOCATION=' \[\033[01;34m\]`pwd | sed "s#\(/[^/]\{1,\}/[^/]\{1,\}/[^/]\{1,\}/\).*\(/[^/]\{1,\}/[^/]\{1,\}\)/\{0,1\}#\1_\2#g"`'
BRANCH=' \[\033[00;33m\]$(git_branch)\[\033[00m\]\n\$ '
PS1=$TIME$USER$HOST$LOCATION$BRANCH

git_branch es una función que muestra la rama git actual, la guardo en mis archivos de puntos, es:

git_branch () {
  git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
  }
Michael Durrant
fuente
¡Esto es asombroso! Muchas gracias por esta respuesta.
Carlos F
4

Mi solución para esto es ligeramente diferente con respecto a cómo lo exporto, así que pensé en compartirlo aquí:

Cree otra variable de cadena de solicitud; PS5 y exporta la siguiente cadena en tu .profile/ .bash_profilearchivo:

\ u : Muestra el nombre de usuario actual.

\ W : Imprime la base del directorio de trabajo actual.

# Display username and current directory only.
export PS5='export PS1="\u:\W$";';

Ahora, cada vez que necesite usar la PS abreviada, simplemente ejecute: eval $PS5


O incluso mejor aún, cree un alias en su .bash_aliasesarchivo: (gracias a @muru )

alias PS5='export PS1="\u:\W$";';

sourcenuevamente, y ahora puede escribir PS5para cambiar.

U-Ways
fuente
1
Esto parece una frankenalias. ¿Por qué no solo usar un alias o una función?
muru
1

Mostrar solo el nombre del directorio actual (no la ruta completa) en la solicitud de bash

La mayoría de las otras soluciones no funcionaron para mí en todos mis sistemas operativos que comparten mis archivos de puntos: AIX, Windoze y Linux. Los puertos golpe eran versiones antiguas que no apoyaban ciertas construcciones y no quería que tenedor otro proceso (es decir sed, awk, etc.), que es notablemente más caro bajo cygwin.

Lo siguiente es largo pero eficaz:

# takes a number argument of the number of last dirs to show
function DIR_LAST {
    # read -a didn't seem to work under bash 3
    IFS='/' array=($PWD)
    len=${#array[@]}
    start=$((len - $1))
    # leading / if fewer dir args: /usr/flastname not usr/flastname
    if (( $start <= 1 )); then
        start=1
        echo -n /
    fi
    for (( i = $start; $i < $len; i++ )); do
        if (( $i > $start )); then
            echo -n /
        fi
        echo -n ${array[$i]}
    done
}
export PS1="\$(DIR_LAST 2) {$(hostname)} "

Quiero que escupe:

/
/usr
/usr/foo
foo/bin

Observe la falta de una barra diagonal en la última línea, que es como me gusta. Además, puede escupir los últimos 3 directorios cambiando el argumento a DIR_LAST.

Además, traté de hacer esto con una expresión regular, BASH_REMATCHpero a bash v3 no parecía gustarle los parens y no pude encontrar la manera de escapar adecuadamente de ellos. Suspiro.

gris
fuente
0

Creo que esta opción es mucho más fácil, simplemente haciendo:

echo $PWD | rev | cut -d '/' -f 1 | rev

Asigne esto a la variable PS1 en su archivo .bashrc:

PS1='$(PWD | rev | cut -d '/' -f 1 | rev)'
Dani Mach
fuente
0
root:~/project#  -> root:~/project(dev)# 

agregue el siguiente código al final de su ~ / .bashrc

force_color_prompt=yes
color_prompt=yes
parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}
if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[01;31m\]$(parse_git_branch)\[\033[00m\]\$ '
else
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w$(parse_git_branch)\$ '
fi
unset color_prompt force_color_prompt
Ali Alp
fuente