A variável $0
contém o caminho do script:
$ cat ~/bin/foo.sh
#!/bin/sh
echo $0
$ ./bin/foo.sh
./bin/foo.sh
$ foo.sh
/home/terdon/bin/foo.sh
$ cd ~/bin
$ foo.sh
./foo.sh
Como você pode ver, a saída depende da maneira como foi chamada, mas sempre retorna o caminho para o script em relação à maneira como o script foi executado. Você pode, portanto, fazer:
## Set mydir to the directory containing the script
## The ${var%pattern} format will remove the shortest match of
## pattern from the end of the string. Here, it will remove the
## script's name,. leaving only the directory.
mydir="${0%/*}"
# config load
source "$mydir"/config.sh
Se o diretório estiver no seu $PATH
, as coisas serão ainda mais simples. Você pode apenas executar source config.sh
. Por padrão, source
procurará arquivos nos diretórios em $PATH
e fornecerá o primeiro que encontrar:
$ help source
source: source filename [arguments]
Execute commands from a file in the current shell.
Read and execute commands from FILENAME in the current shell. The
entries in $PATH are used to find the directory containing FILENAME.
If any ARGUMENTS are supplied, they become the positional parameters
when FILENAME is executed.
Se você tiver certeza de que seu config.sh
é único ou, pelo menos, que é o primeiro encontrado em $PATH
, é possível fornecê-lo diretamente. No entanto, sugiro que você não faça isso e se atenha ao primeiro método. Você nunca sabe quando outro config.sh
pode estar no seu $PATH
.