$ variável PWD equivalente de pwd -P

2

Eu quero usar a variável $PWD em um script, mas quero que seja o caminho do hardware sem links simbólicos. Eu sei sobre /bin/pwd e pwd -P , mas essas não são variáveis.

Eu sei que posso usar:

setenv MYPWD 'pwd -P'

Mas eu lembro de haver outra maneira de fazer isso.

    
por Brian Postow 15.08.2013 / 17:40

3 respostas

4

Em shells POSIX, depois de

cd -P .

$PWD conterá um caminho livre de links simbólicos.

Em zsh , $PWD:A expandirá para a versão livre de links simbólicos de $PWD (funciona para qualquer variável, não apenas $PWD ).

Em zsh , setopt chase_links e em tcsh , set symlinks = chase , faça com que cd verifique se $PWD é livre de links simbólicos. No entanto, isso só funciona após o primeiro cd . Em zsh , cd . tornará $PWD symlink livre, mas não em tcsh , onde você precisará de cd "$cwd" (o que não é garantido que funcione).

    
por 15.08.2013 / 18:16
1

Até onde sei, não existe uma variável fornecida pelo ambiente que garanta que seu valor seja o caminho físico e não uma versão vinculada.

Considerando isso, suas opções estão limitadas às opções que você mencionou, além da seguinte alternativa.

readlink

Você pode usar o comando readlink para obter o diretório / arquivo físico para o qual um link simbólico está apontando:

Exemplo

dados da amostra:

$ ln -s /usr/bin/ack ack

$ ls -l |grep ack
lrwxrwxrwx   1 saml saml        12 Aug 15 11:48 ack -> /usr/bin/ack

localização física:

$ readlink ./ack
/usr/bin/ack
$ readlink /home/saml/ack 
/usr/bin/ack
$ readlink $HOME/ack
/usr/bin/ack

Se o valor que você passar para readlink não for um link, ele não retornará nada. Você pode forçá-lo a retornar o valor canônico usando a opção -f :

$ echo $PWD
/home/saml

$ readlink -f $PWD
/home/saml

Referências

por 15.08.2013 / 17:51
1

Se você estiver usando ksh93 , há uma maneira simples de implementar essa variável. Basta adicionar essa função de disciplina no início de seu script ou ser originada por ele:

function PWDP.get
{
  .sh.value=$(pwd -P)
}

Em seguida, você pode simplesmente usar a variável PWDP conforme o esperado:

$ mkdir /tmp/foo
$ ln -s /tmp/foo /tmp/bar
$ cd /tmp/bar
$ echo $PWD
/tmp/bar
$ echo $PWDP
/tmp/foo

Editar , uma solução "ligeiramente" mais complexa tentando lidar com o ponto Stéphane Chazelas:

function PWDP.get
{
    typeset p=$(pwd -P; echo .)
    .sh.value=${p%??}
}
    
por 16.08.2013 / 02:48