aparar o diretório de trabalho do prompt de comando do terminal


39

Às vezes, ao usar o terminal em uma estrutura profunda de pastas, o prompt pode ocupar a maior parte da linha. Existe alguma maneira de cortar o diretório de trabalho? Eu sei que posso fazer

PS1="\W >"

para imprimir apenas o diretório atual e não o caminho completo, mas existe uma maneira de ter algo como:

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

Respostas:


30

Crie um pequeno script python que implemente a lógica de corte desejada.

Exemplo: ~/.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)

Agora teste-o, a partir de um terminal:

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

Se você estiver de acordo com o resultado, basta anexar o comando ao seu ~/.bashrc.


Não para perguntar o óbvio, mas como exatamente anexamos o comando ao comando ~/.bashrc? Seria apenas colar a última linha na parte inferior do arquivo?
FloatingRock

11
@FloatingRock correto. Basta adicioná-lo ao arquivo .bashrc.
Prefixo

Isso é ótimo! Se você editar o programa python, ele será atualizado automaticamente: doce!
N3sh

legal! imediatamente roubou isso.
ferdy

Atualize essa última impressão ... para imprimir (...) para obter esse trabalho quase como está no python 3 também, ótima dica, obrigado por compartilhar !!
21418 Sean

69

Se você estiver usando o bash4 (Ubuntu 9.10 e mais recente, o bash4), a opção mais fácil é definir a variável PROMPT_DIRTRIM. por exemplo:

PROMPT_DIRTRIM=2

Para um exemplo semelhante ao exemplo de João Pinto, (que funcionará em versões mais antigas do bash e garante que o componente path nunca tenha mais de 30 caracteres), você pode fazer algo assim:

PS1='[\u@\h:$(p=${PWD/#"$HOME"/~};((${#p}>30))&&echo "${p::10}…${p:(-19)}"||echo "\w")]\$ '

4
A documentação para PROMPT_DIRTRIM pode ser encontrada aqui: gnu.org/software/bash/manual/html_node/Bash-Variables.html
Ben Amos

11

Outra maneira de contornar esse problema é incluir uma quebra de linha no PS1, para que o diretório ativo e o prompt real apareçam em linhas separadas, por exemplo:

PS1="\w\n>"

Semelhante a isso, é não alterar o prompt do PS1, mas apenas iniciar o comando com a \ e pressione Enter . Isso força o comando para começar na próxima linha com o prompt de PS2, que é geralmente > ... (Eu não tinha pensado nisso até que eu vi a sua sugestão :)
Peter.O

4

Adicione isso na parte inferior do seu ~/.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) > "

É certo que isso provavelmente poderia ser mais limpo, mas eu queria entender.

Saída esperada para diretórios com mais de três camadas de profundidade.

/home/chris/../Node Projects >

Saída esperada para diretórios do Desktop e vice-versa.

/home/chris/Desktop > 
/home/chris >  
/home

Lindo! Eu só preciso adicionar algumas informações sobre transformar $ HOME em "~ /" e não contar isso como parte do 'length' se $ PWD estiver no diretório inicial.
Michael Burr

1

Esta pequena adição à excelente resposta do @ joão-pinto adiciona o nome do ambiente virtual quando você executa o 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)

Isso é absolutamente essencial! Se você não o tiver, presumirá que seu ambiente virtual Python não está funcionando quando estiver ... por esse motivo, estou descaradamente usando isso para incorporar à minha ideia (com as cores ...).
Mike Roedor

1

Com base na resposta de Cris Sullivan , mas mantendo a ~pasta inicial

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

Você ainda não precisa exportar o PS1 aqui? Parece ótimo.
Chris Sullivan

Sim, você ainda precisa exportar o PS1, conforme detalhado em sua resposta. Acabei de adicionar o diretório de trabalho :-)
Manuel

0

Eu gosto mais deste, PS1="[\W]\\$ "


OP mencionou que eles não estão interessados ​​nisso.
wjandrea

0

esse prompt encurta todos os nomes, exceto a linha atual this:

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

PS1='\u:$$(eval "sps")/\W\$ '

0

Apenas para atualizar um pouco (para Python3) e aprimorar a resposta selecionada para adicionar cores ao prompt de acordo com um prompt do BASH (no Linux Mint 18.3):

#! /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) )

Mais sobre códigos de cores em um terminal BASH aqui . Provavelmente existe uma maneira de descobrir quais cores o seu Terminal usa automaticamente, mas não tenho idéia do que possa ser.

Com a linha shebang, a exportlinha para inclusão no .bashrc se torna:

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

NB1 esses códigos de escape "\ e" sempre devem estar entre "\ [... \]", caso contrário, os retornos de linha ficam completamente confusos.

NB2 para obter seu caminho completo a qualquer momento, basta ir

... $ pwd 

claro...

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.