pwd
me dá
/data/users/me/some/random/folder
Existe uma maneira fácil de obter
~/some/random/folder
de pwd
?
pwd
. Caso contrário, você interromperá os scripts que esperam usar sua saída em contextos que não realizam expansão de til.
pwd
me dá
/data/users/me/some/random/folder
Existe uma maneira fácil de obter
~/some/random/folder
de pwd
?
pwd
. Caso contrário, você interromperá os scripts que esperam usar sua saída em contextos que não realizam expansão de til.
Respostas:
Se você estiver usando o bash, o dirs
built-in terá o comportamento desejado:
dirs +0
~/some/random/folder
(Note +0
, not -0
.)
Com zsh
:
dirs
~/some/random/folder
Para ser exato, primeiro precisamos limpar a pilha de diretórios, caso contrário dirs
, imprimiríamos todo o conteúdo:
dirs -c; dirs
Ou com zsh
o print
builtin:
print -rD $PWD
ou
print -P %~
(que ativa a expansão rápida . %~
in se $PS1
expande para o diretório atual com $HOME
substituído, ~
mas também lida com outros diretórios nomeados, como o diretório inicial de outros usuários ou diretórios nomeados que você define por si mesmo).
Você pode usar o recurso de substituição de substring variável do Bash:
$ pwd
/home/vagrant/foo/bar
$ echo ${PWD/#$HOME/'~'}
~/foo/bar
ksh
e zsh
.
${string/#substring/replacement}
versão para evitar esse comportamento.
echo
) em zsh
. Em outras conchas, $HOME
seria tratado como um padrão e a coisa toda sujeita a divisão + glob.
PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/\~}"'
Usando sed
:
pwd | sed "s|^$HOME|~|"
A idéia é usar qualquer caractere com menor probabilidade de aparecer em um caminho de diretório inicial como o delimitador no sed
regex. No exemplo acima, estou usando |
.
O lado bom dessa técnica é que ela é realmente independente de shell.
Você também pode usar o alias pwd
para /bin/pwd | sed "s|$HOME|~|"
obter esse comportamento em outros scripts que possam estar usando pwd
.
^
âncora no seu regex. Caso contrário, é possível (por mais improvável) que isso substitua um segmento no meio do caminho.
"s|^/home/user\(/.*\)\?$|~\1|"
. Caso contrário, ele corresponde caminhos de outros usuários se os seus nomes são como user1
, user2
, user3
e você corresponder apenasuser
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 renderia resultados imprevisíveis porque qualquer um de seus caracteres constituintes poderia ser caracteres padrão e, portanto, nem sempre renderia o resultado esperado.
Mas a expansão til deve sempre ocorrer como se fosse o resultado de uma expansão citada e, portanto, seus resultados são previsíveis. Isso parece verdadeiro em praticamente todos os shell que testei para case
padrões e parâmetros, com as notáveis exceções de ambos 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 maneira. 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
~
$PWD
está abaixo $HOME
. Você pode usar a mesma idéia combinada com a substituição de padrões para torná-la mais geral. Como é ${PWD/#~/\~}
?
Você pode tentar substituir a parte indesejada por sed
:
pwd | sed 's,^/data/users/me,~,'
ou melhor ainda:
pwd | sed "s,^$HOME,~,"
^
âncora para garantir que apenas correspondências no início do caminho do diretório sejam substituídas. Além disso, você não precisa usá-lo g
porque o comando deve substituir 1 ocorrência no máximo.
/home/alice
e meu diretório atual for /home/aliceinchains
. Mas se a única vez em que eu quiser usar o recurso for quando eu souber que sou meu diretório pessoal ou um de seus subdiretórios, ele deverá funcionar.