Aplica o readlink a um arquivo não-symlink?

0

O seguinte código do link para obter o nome do caminho para o diretório pai de um script dentro do script, mesmo se o O script é executado por meio de um link simbólico para ele:

if [ -L $0 ] ; then
    DIR=$(dirname $(readlink -f $0)) ;
else
    DIR=$(dirname $0) ;
fi ;

É o código acima equivalente a

DIR=$(dirname $(readlink -f $0)) ;

i.e. Existe realmente uma necessidade de testar se $0 é um symlink, e executar comandos diferentes se sim e se não?

Por que não usar apenas $(dirname $(readlink -f $0)) , independentemente de o $0 conter um link simbólico ou não?

Especificamente, se $0 contiver symlink, então é perfeito usar $(dirname $(readlink -f $0)) .

se $0 não é um symlink, então parece-me perfeito usar apenas $(dirname $(readlink -f $0)) :

  • $(readlink -f $0) retorna o caminho absoluto de $0 e $(dirname $(readlink -f $0)) retorna o caminho absoluto para o diretório pai de $0

  • $(dirname $0) retorna um caminho para o pai de $0 , se o retorno é um caminho absoluto ou relativo, dependendo de se $0 é um caminho absoluto ou relativo.

  • Eu não acho que o valor de DIR seja um caminho absoluto ou relativo é importante no código original, porque em ambos os casos, o valor de DIR refere-se ao diretório pai de $0 . Então, são $(dirname $(readlink -f $0)) e $(dirname $0) equivalentes no código original?

Obrigado.

    
por Tim 21.03.2018 / 05:35

1 resposta

1

Você deve usar "$0" e dirname "$()" .

Os comandos não são equivalentes porque o teste de shell afeta apenas o último componente no caminho, mas readlink -f afeta todos os níveis de caminho.

mkdir physdir
touch physdir/file
ln -s physdir symlink
test -L symlink/file ; echo $?
    1
test -L symlink ; echo $?
    0
dirname symlink/file
    symlink
dirname "$(readlink -f symlink/file)"
    /crypto/home/hl/tmp/stackexchange/readlink/physdir

Assim, para caminhos relativos, a saída é bem diferente, mas mesmo para caminhos absolutos, os diretórios de links simbólicos são diferentes.

    
por 21.03.2018 / 06:21