Como obter ~ / foo de / home / user1 / foo?

0

O prompt do Bash suporta a sequência de escape \w , documentada como

\w     the current working directory, with $HOME abbreviated
       with a tilde (uses the value of the PROMPT_DIRTRIM variable)

Existe alguma maneira de obter uma abreviação semelhante para uma string arbitrária? Ou seja, existe um comando geral que faz algo como o seguinte, desde que HOME = / home / user1

/home/user1         → ~
/home/user1/a/1     → ~/a/1
/home/user2/b/2     → ~user2/b/2
/root               → ~root

Claro, eu poderia tentar algo feio com sed, mas é improvável que isso me dê o resultado que eu quero em qualquer caso. : -)

A motivação por trás disso é que eu gostaria de manter os títulos nas guias dos meus terminais o mais curto possível, abreviando os diretórios de trabalho sempre que possível.

ATUALIZAÇÃO: Como não parece ser uma solução satisfatória facilmente disponível, e gostaria de manter as coisas suficientemente rápidas, agora eu fui com um simples

pwd | sed -e "s|/root|~root|" -e "s|/home/user1|~|

e algo semelhante para o root. Como eu sou o único usuário na máquina, isso atualmente funciona mais ou menos. Vou manter a questão em aberto caso alguém encontre magical-tool-that-solves-all-problems (idealmente não escrito em elisp…).

    
por Claudius 28.11.2012 / 22:07

2 respostas

2

Para o seu diretório pessoal, use dir="${PWD/#$HOME/~}" .

Para remover apenas /home/ , como sugere Glenn, use também dir="${dir/#\/home\//~}" .

A conversão de homedirs de outros usuários é muito mais complicada, já que você deve listar todos usuários todas as vezes.

  • Você não pode nem parar no primeiro jogo, já que as poucas primeiras contas têm um homedir de / , que sempre corresponderá. Em vez disso, é necessário verificar o prefixo mais longo , o que não é simples.

  • Costumo trabalhar com servidores configurados para ler contas de usuários do LDAP, o que leva um segundo inteiro para listar todas as contas; Enquanto isso, o Active Directory nem permitiria ver a lista inteira.

por 28.11.2012 / 22:27
1

Para o usuário atual e uma string armazenada em uma variável chamada DIR , isso funcionará: ${DIR/~/\~}

Ele substitui a expansão de ~ , que é o valor da variável $HOME ou o diretório inicial do usuário atual, com um literal ~ .

    
por 28.11.2012 / 22:38