Use ${BASH_SOURCE[-1]} :
script_dir=$( dirname "$( readlink -f "${BASH_SOURCE[-1]}" )" )
Esta é uma matriz que contém os arquivos de origem para a pilha de chamadas da função shell atual, e o último elemento dela será a origem do script principal.
Isso deve funcionar independentemente de o script ser originado com source ou não.
A versão específica de bash que você está usando é a versão 4.2.1. Índices negativos em matrizes (referências do final da matriz) foram adicionados na versão 4.3. Para obter o mesmo efeito de usar ${BASH_SOURCE[-1]} em uma versão pré-4.3 de bash , use
${BASH_SOURCE[ ${#BASH_SOURCE[@]} - 1 ]}