O shell sempre conhece o caminho para o script em circunstâncias normais, porque é necessário lê-lo. Observe que há circunstâncias em que isso não é verdadeiro, por exemplo, com scripts setuid nos sistemas operacionais que os suportam (não no Linux) - mas scripts de shell setuid são uma má idéia de qualquer maneira. Mais importante ainda, o script pode ter sido movido entre o momento em que o shell foi aberto e a hora em que você tenta fazer alguma coisa com ele. Portanto, use somente o caminho para o script quando não houver preocupação de segurança ou confiabilidade ao fazer isso. Um pacote de software com uma estrutura conhecida é um caso de uso válido.
O caminho para o script que foi passado para o interpretador de shell está disponível no parâmetro especial $0
. Este pode ser um caminho relativo, então se você for usá-lo, faça isso antes de mudar para outro diretório. Você pode usá-lo se souber que o script não será movido nesse meio tempo.
Como $0
pode ser um link simbólico, você precisará obter o alvo. Não existe uma maneira POSIX para fazer isso, mas no Linux (GNU coreutils ou BusyBox) e no recente BSD você pode usar readlink -f
para obter um .
script_path_in_package=$(readlink -f -- "$0")
script_directory=${script_path_in_package%/*}
Observe que isso restringe as maneiras pelas quais você pode estruturar seu pacote. Por exemplo, você não pode colocar o script em uma árvore de diretórios independente de arquitetura e vinculá-lo a cada árvore de diretórios específica da arquitetura.