¿Directorio actual abreviado en indicador de shell?

23

vim tiene una característica realmente agradable que utiliza en sus rutas cuando son un poco largas:

ingrese la descripción de la imagen aquí

Abrevia la ruta al documento en la pestaña en la parte superior. ¿Hay alguna manera de hacer algo similar a esto para que mi bash prompt no se vea así?

rfkrocktk@work-laptop ~/Documents/Projects/Work/maventest/src/main/java/com/tkassembled/ $ 
Naftuli Kay
fuente
2
Entonces, ¿qué quieres es rfkrocktk@work-laptop ~/D/P/W/m/src/main/java/com/tkassembled/ $ ? Idealmente, ¿usa algún umbral para la longitud máxima del indicador?
nicerobot
Exactamente, eso es lo que estoy buscando.
Naftuli Kay
Ok, proporcioné mi respuesta.
nicerobot

Respuestas:

14

Intenta esto :

PROMPT_COMMAND='PS1X=$(perl -pl0 -e "s|^${HOME}|~|;s|([^/])[^/]*/|$""1/|g" <<<${PWD})'

o, puro golpe:

PROMPT_COMMAND='PS1X=$(p="${PWD#${HOME}}"; [ "${PWD}" != "${p}" ] && printf "~";IFS=/; for q in ${p:1}; do printf /${q:0:1}; done; printf "${q:1}")'

luego

PS1='\u@\h ${PS1X} $ '

produce (observe el ~para ${HOME}):

rfkrocktk@work-laptop ~/D/P/W/m/s/m/j/c/tkassembled $

Mejoré mi respuesta gracias a @ enzotib's

nicerobot
fuente
1
¿Puedes dar un ejemplo de cómo se vería esto como un aviso para la posteridad?
Naftuli Kay
(0) Su enlace github está roto. (1) Es posible que desee echar un vistazo más de cerca a la prueba $PWD~. Actualmente, si HOMEes /home/edy PWDes /home/edwina, obtienes ~winala versión Perl y ~/inala versión shell. (2) Su código de shell se bloquea si el directorio actual contiene caracteres comodín (es decir, expansión de nombre de ruta); por ejemplo, PWD= /abc/*/def. Puede solucionar esto agregando set -o noglobo set -f. … (Continúa)
G-Man dice 'Restablecer a Monica' el
(Continúa) ... (3) No necesitas tantos aparatos ortopédicos. En el comando Perl, $HOME(que está entre comillas dobles) y $PWDson lo suficientemente buenos. En el comando de shell, las tres últimas referencias a variables de shell están bien, pero los tres primeros pueden ser "${PWD#$HOME}", "$PWD"y "$p". (4) Véase también la respuesta de mbentley y mis comentarios al respecto.
G-Man dice 'reinstalar a Monica' el
15

Similar a la respuesta @nicerobot, pero algo más corta:

PROMPT_COMMAND='pwd2=$(sed "s:\([^/]\)[^/]*/:\1/:g" <<<$PWD)'
PS1='\u@\h:$pwd2\$ '

Esto mostrará la siguiente salida de ejemplo:

enzotib@acer:/h/enzotib$ cd
enzotib@acer:/h/enzotib$ cd /usr/share/doc/acpid/examples/
enzotib@acer:/u/s/d/a/examples$
enzotib
fuente
13

Me gusta PROMPT_DIRTRIMen bash ...

export PROMPT_DIRTRIM=2

cambiará su solicitud de ejemplo a ...

rfkrocktk@work-laptop ../com/tkassembled/ $

Esto funciona para mi.

BentFX
fuente
No hace lo que pidió, pero gracias por informarme de la función.
nicerobot
3
@nicerobot Sí, tenías la respuesta real. :) Sé que no da la abreviatura que estaba pidiendo, pero a menudo cuando vemos opciones simples nuestras expectativas cambian. Además, es estándar y, como tal, sentí que merecía una mención.
BentFX
1
Creo que una de las funciones de SE es no solo proporcionar la respuesta perfecta a la pregunta, sino también proporcionar otras opciones para el OP y otros que encuentran la pregunta a través de la búsqueda. Observe el contexto de respuesta que proporcioné "Me gusta ... funciona para mí". Todavía algunos creen que merece un voto negativo.
BentFX
Tiendo a ver las respuestas bajar votado que no responde directamente a la pregunta, pero estoy de acuerdo con usted en que proporcionan alternativas pueden ser una respuesta válida o respuesta .
nicerobot
La respuesta de BentFX no responde la pregunta del OP en su conjunto, sino exactamente el tema ¿ Directorio actual abreviado en el indicador de comandos de shell? que es probablemente para la mayoría de los visitantes de este tema exactamente lo que están buscando.
TNT
4

Agregando a la respuesta de enzotib , el siguiente fragmento será:

  1. Convierte /Path/To/Your/Home/a ~/(para que haya una ruta en ~/a/b/clugar de /P/T/Y/H/a/b/c)
  2. Use la primera letra de un 'archivo de puntos' en lugar de mostrar solo el punto ( /a/./c/dse convertirá /a/.b/c/d):

    PROMPT_COMMAND='PS1_PATH=$(sed "s:\([^/\.]\)[^/]*/:\1/:g" <<< ${PWD/#$HOME/\~})'
    export PS1='\u@\h:$PS1_PATH\$ '

Asegúrese de usar comillas simples o bash lo expandirá prematuramente.

renlo
fuente
3

El formato para usar en su PS1es \W(consulte la PROMPTINGsección en la bashpágina del manual).

PS1="\u@\h \W\$ "

Y es posible que desee leer las otras opciones allí, puede hacer algunas cosas interesantes con su línea de comando.

Kevin
fuente
2
Creo que \ W no hace nada de lo que está pidiendo.
nicerobot
1
@nicerobot No proporciona la primera inicial de cada componente de la ruta, pero sí proporciona el directorio de trabajo actual de una manera más corta. Estoy bastante seguro de que no es posible abreviar el directorio de esa manera sin usar un script bastante feo ejecutado en cada solicitud. Veremos lo que tiene que decir sobre esto.
Kevin
1

Me encanta la salida del ejemplo de nicerobot pero encontré un problema. Tengo un directorio que tiene un guión A-E, y lo veía -Ecomo un argumento de printfcuando era mi directorio de trabajo actual. Para solucionar esto, agregué --las últimas printfcomillas y agregué alrededor de la salida en caso de que no haya nada que mostrar:

p="${PWD#${HOME}}"; [ "${PWD}" != "${p}" ] && printf "~";IFS=/; for q in ${p:1}; do printf /${q:0:1}; done; printf -- "${q:1}"
mbentley
fuente
(1) Buena captura sobre el tema del nombre del directorio que contiene -como segundo carácter. Si bien es cierto que esa --es la solución general al problema de los argumentos -, un mejor método printfes decir printf "%s" "${q:1}", ya que esto también protege contra los argumentos que contienen %. (Por ejemplo, intente PWD= /home/mbentley/Documents/Projects/Work/maventest/src/main/java/com/abc%def. (2) Vea también mis comentarios sobre la respuesta de nicerobot.
G-Man dice 'Reinstate Monica' el