Fazer pwd resultar em termos de “~”?

21

pwd me dá

/data/users/me/some/random/folder

Existe uma maneira fácil de obter

~/some/random/folder

de pwd ?

    
por Sibbs Gambling 03.06.2015 / 08:16

5 respostas

22

Se você está usando o bash, então o dirs builtin tem o comportamento desejado:

dirs +0
~/some/random/folder

(Nota +0 , não -0 .)

com zsh :

dirs
~/some/random/folder

Para ser exato, primeiro precisamos limpar a pilha de diretórios, senão dirs imprimiria todo o conteúdo:

dirs -c; dirs

Ou com zsh print construído:

print -rD $PWD

ou

print -P %~

(aquele que ativa a expansão do prompt . %~ in $PS1 expande para o diretório atual com $HOME substituído por ~ , mas também lida com outros diretórios nomeados como o diretório inicial de outros usuários ou diretórios nomeados que você mesmo define).

    
por 03.06.2015 / 08:30
16

Você pode usar o recurso de substituição de substring de variáveis Bash:

$ pwd
/home/vagrant/foo/bar
$ echo ${PWD/#$HOME/'~'}
~/foo/bar
    
por 03.06.2015 / 10:55
6

Usando sed :

pwd | sed "s|^$HOME|~|"

A ideia é usar qualquer caractere com menor probabilidade de aparecer em um caminho de diretório inicial como o delimitador em sed regex. No exemplo acima, estou usando | .

O bom desta técnica é que ela é, na verdade, independente de shell.

Você também pode alias pwd to /bin/pwd | sed "s|$HOME|~|" para obter esse comportamento em outros scripts que possam estar usando pwd .

    
por 03.06.2015 / 08:29
2
tilde=\~${PWD#~}

Eu acho que é isso que você quer?

O que é interessante sobre o til é quando ele é expandido como um padrão que não precisa ser citado. Usar $HOME da mesma maneira sem aspas renderizaria resultados imprevisíveis porque qualquer um dos seus caracteres constituintes poderia ser caracteres padrão e, portanto, nem sempre o resultado esperado seria esperado.

Mas a expansão do til é especificada para sempre ocorrer como se fosse o resultado de uma expansão entre aspas e, portanto, seus resultados são previsíveis. Isso parece ser verdade em praticamente todos os shell que testei para os padrões case e padrões de parâmetros com as exceções notáveis de ksh93 e mksh por qualquer motivo - nenhum dos quais parece honrar o aspecto citado do til nessa capacidade.

Outra coisa interessante sobre isso é que você pode redefinir $HOME para manipular qualquer diretório da mesma forma. Por exemplo:

cd ~
HOME=/some/prefix/I/would/like/to/trim 
#or, perhaps more usefully, some scripted means of arriving at same
tilde=\~${OLDPWD#~}
HOME=$PWD

Aqui está outro exemplo:

set 1 2 3 4 5 \~
cd ~; cd -; HOME= IFS=/
for d do shift
      HOME=${*#~/}/$d
      set ~ "$d" $HOME
done; cd -; HOME=$PWD
printf %s\n "$@"
5/4/3/2/1/2/3/4/5/~/1/2/3/4/5/~
~
5
4
3
2
1
2
3
4
5
~
1
2
3
4
5
~
    
por 03.06.2015 / 12:51
0

Você pode tentar substituir a parte indesejada por sed :

pwd | sed 's,^/data/users/me,~,'

ou melhor:

pwd | sed "s,^$HOME,~,"
    
por 03.06.2015 / 08:28