recortar el directorio de trabajo del símbolo del sistema del terminal

39

Cuando se utiliza el terminal en una estructura de carpetas profunda, a veces el indicador puede ocupar la mayor parte de la línea. ¿Hay alguna forma de recortar el directorio de trabajo? Se que puedo hacer

PS1="\W >"

para imprimir solo el directorio actual y no la ruta completa, pero hay una manera de tener algo como:

/home/smauel/de...ther/folder >
smauel
fuente

Respuestas:

30

Cree un pequeño script de Python que implemente la lógica de recorte deseada.

Ejemplo: ~/.short.pwd.py

import os
from socket import gethostname
hostname = gethostname()
username = os.environ['USER']
pwd = os.getcwd()
homedir = os.path.expanduser('~')
pwd = pwd.replace(homedir, '~', 1)
if len(pwd) > 33:
    pwd = pwd[:10]+'...'+pwd[-20:] # first 10 chars+last 20 chars
print '[%s@%s:%s] ' % (username, hostname, pwd)

Ahora pruébelo, desde un terminal:

export PROMPT_COMMAND='PS1="$(python ~/.short.pwd.py)"'

Si está de acuerdo con el resultado, simplemente agregue el comando a su ~/.bashrc.

João Pinto
fuente
No para preguntar lo obvio, pero ¿cómo le agregamos exactamente el comando al ~/.bashrc? ¿Sería solo pegar esa última línea al final del archivo?
FloatingRock
1
@FloatingRock correcto. Simplemente agréguelo al archivo .bashrc.
Prefijo
¡Esto es genial! Si edita el programa Python, se actualiza automáticamente: ¡dulce!
N3sh
¡guay! Inmediatamente robó esto.
ferdy
Actualice esa última impresión ... para imprimir (...) para obtener este trabajo casi como está para Python 3 también, excelente consejo, ¡gracias por compartir!
Sean
69

Si está utilizando bash4 (Ubuntu 9.10 y más reciente tiene bash4), la opción más fácil es simplemente configurar la variable PROMPT_DIRTRIM. p.ej:

PROMPT_DIRTRIM=2

Para uno similar al ejemplo de João Pinto, (que funcionará en versiones anteriores de bash y asegura que el componente de ruta nunca tenga más de 30 caracteres), puede hacer algo como esto:

PS1='[\u@\h:$(p=${PWD/#"$HOME"/~};((${#p}>30))&&echo "${p::10}…${p:(-19)}"||echo "\w")]\$ '
geirha
fuente
44
La documentación para PROMPT_DIRTRIM se puede encontrar aquí: gnu.org/software/bash/manual/html_node/Bash-Variables.html
Ben Amos
11

Otra forma de evitar ese problema es incluir un salto de línea en PS1, de modo que el directorio de trabajo y la solicitud real aparezcan en líneas separadas, por ejemplo:

PS1="\w\n>"
ak2
fuente
Similar a esto, es no cambiar su solicitud de PS1, sino simplemente comenzar su comando con un \ y presionar Enter . Esto obliga al comando a comenzar en la siguiente línea con el indicador de PS2, que generalmente es > ... (No lo había pensado hasta que vi su sugerencia :)
Peter.O
4

Agregue esto al final de su ~/.bashrc

split_pwd() {
        # Only show ellipses for directory trees -gt 3
        # Otherwise use the default pwd as the current \w replacement
        if [ $(pwd | grep -o '/' | wc -l) -gt 3 ]; then
                pwd | cut -d'/' -f1-3 | xargs -I{} echo {}"/../${PWD##*/}"
        else
                pwd
        fi
}


export PS1="\$(split_pwd) > "

Es cierto que esto probablemente podría ser más limpio, pero quería intentarlo.

Salida esperada para directorios de más de tres capas de profundidad.

/home/chris/../Node Projects >

Salida esperada para directorios desde el escritorio y la parte posterior.

/home/chris/Desktop > 
/home/chris >  
/home
Chris Sullivan
fuente
¡Hermosa! Solo necesito agregar algunas ideas sobre cómo transformar $ HOME en "~ /" y no contarlo como parte de la 'longitud' si $ PWD está en el directorio de inicio.
Michael Burr
1

Esta pequeña adición a la excelente respuesta de @ joão-pinto agrega el nombre del entorno virtual cuando ejecuta el workoncomando.

import os
from platform import node
hostname = node().split('.')[0]
username = os.environ['USER']
pwd = os.getcwd()
homedir = os.path.expanduser('~')
pwd = pwd.replace(homedir, '~', 1)

# check for the virtualenv
ve = os.getenv('VIRTUAL_ENV')

if ve:
    venv = '(`basename \"$VIRTUAL_ENV\"`)'
else:
    venv = ''

if len(pwd) > 33:
    pwd = pwd[:10]+'...'+pwd[-20:] # first 10 chars+last 20 chars
print '%s[%s@%s:%s] ' % (venv, username, hostname, pwd)
katahdin
fuente
¡Esto es absolutamente esencial! Si no lo tiene, asumirá que su entorno virtual de Python no funciona cuando lo está ... por esta razón, estoy usando descaradamente esto para incorporarlo a mi idea (con los colores ...).
Mike roedor
1

Basado en la respuesta de Cris Sullivan , pero manteniendo la ~carpeta de inicio

get_bash_w() {
  # Returns the same working directory that the \W bash prompt command
  echo $(pwd | sed 's@'"$HOME"'@~@')
}

split_pwd() {
  # Split pwd into the first element, elipsis (...) and the last subfolder
  # /usr/local/share/doc --> /usr/.../doc
  # ~/project/folder/subfolder --> ~/project/../subfolder
  split=2
  W=$(get_bash_w)
  if [ $(echo $W | grep -o '/' | wc -l) -gt $split ]; then
    echo $W | cut -d'/' -f1-$split | xargs -I{} echo {}"/../${W##*/}"
  else
    echo $W
  fi
}

export PS1="\$(split_pwd) > "
Manuel
fuente
¿Todavía no necesitas exportar PS1 aquí? Se ve muy bien.
Chris Sullivan
Sí, aún necesita exportar PS1, como detalla en su respuesta. Acabo de agregar el directorio de trabajo :-)
Manuel
0

Este me gusta más PS1="[\W]\\$ "

Medya
fuente
OP mencionó que no están interesados ​​en eso.
wjandrea
0

Este mensaje acorta todos los nombres excepto la línea actual:

user:/h/t/D/C/current$ 
sps() {
    echo `dirname $PWD` | sed -r 's|/(.)[^/]*|/\1|g'
}

PS1='\u:$$(eval "sps")/\W\$ '
Travis S
fuente
0

Solo para actualizar ligeramente (para Python3) y mejorar la respuesta seleccionada para agregar colores a la solicitud según una solicitud de BASH (en Linux Mint 18.3 de todos modos):

#! /usr/bin/python3

import os, getpass
from socket import gethostname

username = getpass.getuser()
hostname = gethostname()
pwd = os.getcwd()
homedir = os.path.expanduser('~')
pwd = pwd.replace(homedir, '~', 1)

if len(pwd) > 40:
    # first 10 chars+last 30 chars
    pwd = pwd[:10] + '...' + pwd[-30:] 

# Virtual environment being used? Essential not to omit!
ve = os.getenv('VIRTUAL_ENV')
venv = '(`basename \"$VIRTUAL_ENV\"`)' if ve else ''

# colours as per my current BASH Terminal: 
# username + hostname: bold green
# path and $: bold blue
print( '\[\e[;1;32m\]%s%s@%s \[\e[;1;34m\]%s $\[\e[0m\]  ' % (venv, username, hostname, pwd) )

Más información sobre códigos de color en un terminal BASH aquí . Probablemente haya alguna forma de averiguar qué colores usa su Terminal automáticamente, pero no tengo ni idea de qué podría ser.

Con la línea shebang el export línea para inclusión en .bashrc se convierte en:

export PROMPT_COMMAND='PS1="$(~/.local/bin/manage_prompt.py)"' # adjust path to .py file

NB1 estos códigos de escape "\ e" siempre deben estar encerrados en "\ [... \]", de lo contrario, los retornos de línea se desordenarán por completo.

NB2 para obtener tu camino completo en cualquier momento solo ve

... $ pwd 

por supuesto...

Mike roedor
fuente