Diretório atual abreviado no prompt do shell?


23

vim tem um recurso muito bom que ele utiliza em seus caminhos quando eles são um pouco longos:

insira a descrição da imagem aqui

Abrevia o caminho para o documento na guia na parte superior. Existe uma maneira de fazer algo semelhante a isso, para que meu prompt do bash não seja assim:

rfkrocktk@work-laptop ~/Documents/Projects/Work/maventest/src/main/java/com/tkassembled/ $ 

2
Então, o que você quer é rfkrocktk@work-laptop ~/D/P/W/m/src/main/java/com/tkassembled/ $ ? Idealmente, usando algum limite para o comprimento máximo do prompt?
nicerobot

Exatamente, é isso que estou procurando.
Naftuli Kay

Ok, eu forneci minha resposta.
Niterobot

Respostas:


14

Tente o seguinte :

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

ou, bash puro:

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

então

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

produz (observe o ~para ${HOME}):

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

Melhorei minha resposta graças ao @ enzotib's


1
Você pode fornecer um exemplo de como isso seria um aviso para a posteridade?
Naftuli Kay

(0) Seu link do github está quebrado. (1) Você pode dar uma olhada no teste $PWD~. Atualmente, se HOMEé /home/ede PWDé /home/edwina, você entra ~winana versão Perl e ~/inana versão shell. (2) Seu código de shell engasga se o diretório atual contiver algum caractere curinga (ou seja, expansão do nome do caminho); por exemplo, PWD= /abc/*/def. Você pode corrigir isso adicionando set -o noglobou set -f. ... (continua)
G-Man diz 'Restabelecer Monica'

(Continua) ... (3) Você não precisa de tantos aparelhos. No comando Perl $HOME(que está dentro de aspas duplas) e $PWDé bom o suficiente. No comando shell, nos últimos três referências de variáveis shell são bons, mas os três primeiros podem ser "${PWD#$HOME}", "$PWD"e "$p". (4) Veja também a resposta de mbentley e meus comentários a respeito.
G-Man Diz 'Reinstate Monica'

15

Semelhante à resposta @nicerobot, mas um pouco mais curta:

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

Isso mostrará o seguinte exemplo de saída:

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

13

Eu gosto PROMPT_DIRTRIMde bash ...

export PROMPT_DIRTRIM=2

alterará seu prompt de exemplo para ...

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

Funciona para mim.


Não faz o que ele pediu, mas obrigado por me informar sobre o recurso.
Niterobot

3
@ nicerobot Sim, você teve a resposta real. :) Eu sei que não dá a abreviação que ele estava pedindo, mas geralmente quando vemos opções simples, nossas expectativas mudam. Além disso, é padrão e, como tal, senti que merecia uma menção.
BentFX

1
Eu sinto que uma das funções do SE é não apenas fornecer a resposta perfeita para a pergunta, mas também fornecer outras opções para o OP e outros que a encontrarem através da pesquisa. Observe o contexto de resposta que forneci "Gosto ... funciona para mim". Ainda assim, alguns acreditam que merece uma votação negativa.
BentFX

I tendem a ver as respostas descer votaram que não respondem directamente à pergunta, mas eu concordo com você que o fornecimento de alternativas pode ser uma resposta válida ou resposta .
Nicerobot

A resposta da BentFX não responde à pergunta do OP como um todo, mas exatamente o diretório atual abreviado do assunto no prompt do shell? provavelmente para a maioria dos visitantes deste tópico, exatamente o que estão procurando.
TNT

4

Adicionando à resposta do enzotib , o seguinte trecho será:

  1. Converter /Path/To/Your/Home/em ~/(para que um caminho seja em ~/a/b/cvez de /P/T/Y/H/a/b/c)
  2. Use a primeira letra de um 'arquivo de ponto' em vez de mostrar apenas o ponto (/a/./c/d se tornará /a/.b/c/d):

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

Certifique-se de usar aspas simples ou o bash o expandirá prematuramente.


3

O formato para uso em seu PS1é \W(consulte a PROMPTINGseção na bashpágina de manual).

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

E você pode querer ler as outras opções lá, pode fazer algumas coisas legais com sua linha de comando.


2
Eu acho que \ W não faz o que ele está pedindo.
Niterobot

1
@nicerobot Não fornece a primeira inicial de todos os componentes do caminho, mas fornece o diretório de trabalho atual de maneira mais curta. Tenho certeza de que não é possível abreviar o diretório dessa maneira sem usar algum script bastante feio executado a cada prompt. Vamos ver o que ele tem a dizer sobre isso.
22411 Kevin

1

Adoro a saída do exemplo do nicerobot, mas encontrei um problema. Eu tenho um diretório que tem um hífen A-E, e estava vendo -Ecomo argumento printfquando era meu diretório de trabalho atual. Para corrigir isso, adicionei --as últimas printfe adicionei aspas ao redor da saída, caso não exista nada para a saída:

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

(1) Boa captura do problema do nome do diretório que contém -o segundo caractere. Embora seja verdade que essa --é a solução geral para a questão dos argumentos iniciados por -, um método melhor printfé dizer printf "%s" "${q:1}", pois isso também protege contra argumentos que contenham %. (Por exemplo, tente PWD= /home/mbentley/Documents/Projects/Work/maventest/src/main/java/com/abc%def. (2) Veja também meus comentários sobre a resposta de nicerobot.
G-Man diz 'Reinstate Monica'
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.