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 dirsbuilt-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 zsho printbuiltin:
print -rD $PWD
ou
print -P %~
(que ativa a expansão rápida . %~in se $PS1expande para o diretório atual com $HOMEsubstituí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
kshe zsh.
${string/#substring/replacement}versão para evitar esse comportamento.
echo) em zsh. Em outras conchas, $HOMEseria 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 sedregex. No exemplo acima, estou usando |.
O lado bom dessa técnica é que ela é realmente independente de shell.
Você também pode usar o alias pwdpara /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, user3e 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 $HOMEda 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 casepadrões e parâmetros, com as notáveis exceções de ambos ksh93e mkshpor qualquer motivo - nenhum dos quais parece honrar o aspecto citado do til nessa capacidade.
Outra coisa interessante sobre isso é que você pode redefinir $HOMEpara 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
~
$PWDestá 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 gporque o comando deve substituir 1 ocorrência no máximo.
/home/alicee 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.