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.