Isso é a definição POSIX de .dot
:
The shell shall execute commands from the file in the current environment.
If file does not contain a
/<slash>
, the shell shall use the search path specified by$PATH
to find the directory containing file. Unlike normal command search, however, the file searched for by the.dot
utility need not be executable. If no readable file is found, a non-interactive shell shall abort; an interactive shell shall write a diagnostic message to standard error, but this condition shall not be considered a syntax error.
Considerando o acima, é melhor substituir apenas [ -f ./file ] && source ./file
por . ./file
. Se o arquivo não está lá, o pior que vai acontecer é que você receberá um aviso no login - que é provavelmente a informação que você gostaria de ter, eu acho.
Claro, se você preferir manter o teste que você pode fazer:
test -f ./file && . $_