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$PATHto find the directory containing file. Unlike normal command search, however, the file searched for by the.dotutility 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 && . $_