Antes tarde do que nunca, suponho. Eu estava motivado a desenvolver isso especificamente porque meus scripts do Fedora não estavam funcionando no Mac. O problema é dependências e Bash. Os Macs não os possuem ou, se o possuem, geralmente estão em outro lugar (outro caminho). A manipulação do caminho de dependência em um script Bash entre plataformas é, na melhor das hipóteses, uma dor de cabeça e, na pior das hipóteses, um risco de segurança - por isso, é melhor evitar o uso, se possível.
A função get_realpath () abaixo é simples, centrada no Bash e nenhuma dependência é necessária. Eu uso apenas o Bash builtins eco e cd . Também é bastante seguro, pois tudo é testado em cada estágio do caminho e retorna condições de erro.
Se você não quiser seguir os links simbólicos, coloque set -P na frente do script, mas, caso contrário, o cd deverá resolver os links simbólicos por padrão. Foi testado com argumentos de arquivo que são {absolute | parente | link simbólico | local} e retorna o caminho absoluto para o arquivo. Até agora, não tivemos problemas com isso.
function get_realpath() {
if [[ -f "$1" ]]
then
# file *must* exist
if cd "$(echo "${1%/*}")" &>/dev/null
then
# file *may* not be local
# exception is ./file.ext
# try 'cd .; cd -;' *works!*
local tmppwd="$PWD"
cd - &>/dev/null
else
# file *must* be local
local tmppwd="$PWD"
fi
else
# file *cannot* exist
return 1 # failure
fi
# reassemble realpath
echo "$tmppwd"/"${1##*/}"
return 0 # success
}
Você pode combinar isso com outras funções get_dirname, get_filename, get_stemname e validate_path. Estes podem ser encontrados em nosso repositório GitHub como realpath-lib (divulgação completa - este é o nosso produto, mas o oferecemos gratuitamente à comunidade, sem restrições). Também poderia servir como uma ferramenta instrucional - está bem documentada.
Tentamos o nosso melhor para aplicar as chamadas práticas 'modernas do Bash', mas o Bash é um grande assunto e tenho certeza de que sempre haverá espaço para melhorias. Requer o Bash 4+, mas pode ser feito para funcionar com versões mais antigas, se ainda estiverem por aí.
readlink
pode ser um comando interno ou externo.