Não posso comentar outra resposta, por isso estou postando aqui. Como dito, dirname apenas lê $0 e pega o nome do diretório, então se você chamou algo como ../../directory/something.sh ele não resolve esses pontos, mas apenas retorna ../../directory . Em vez de usar a expansão subshell com cd e pwd , você pode usar um comando muito inteligente readlink que realmente resolve não apenas diretórios pontilhados, mas também todos os links simbólicos. Portanto, sugiro
echo "I am located at $(readlink -e -- "$0")"
Você pode usar outro dirname em torno disso para obter o diretório em vez do arquivo.