Você pode sinalizar sua função como 'somente leitura' em file2.sh.
Nota: isso causará avisos quando file1.sh mais tarde tentar definir (redefinir) a função.
Esses avisos aparecerão no stderr e podem causar problemas. Não sei se podem ser desativados.
Outra observação: isso pode fazer com que os scripts falhem, se eles estiverem verificando o status de retorno da definição da função. Eu acho que há também uma opção bash que pode ser configurada, o que faria com que um status de retorno diferente de zero em qualquer lugar abortasse a execução do script. Boa sorte!
Você pode modificar o arquivo1.sh? O simples uso de condicionais para verificar se a função está definida antes de defini-la seria uma solução mais robusta.
Aqui está um exemplo de uso de 'readonly'.
hobbes@metalbaby:~/scratch$ mkdir bash-source-test
hobbes@metalbaby:~/scratch$ cd bash-source-test
hobbes@metalbaby:~/scratch/bash-source-test$ cat > file2.sh
#!/bin/bash
fname(){
echo "file2"
}
readonly -f fname
hobbes@metalbaby:~/scratch/bash-source-test$ cat > file1.sh
#!/bin/bash
fname(){
echo "file1"
}
readonly -f fname
hobbes@metalbaby:~/scratch/bash-source-test$ cat >top.sh
#!/bin/bash
if [ $1 ]; then
source file2.sh
fi
source file1.sh
fname
hobbes@metalbaby:~/scratch/bash-source-test$ chmod +x *.sh
hobbes@metalbaby:~/scratch/bash-source-test$ ./top.sh
file1
hobbes@metalbaby:~/scratch/bash-source-test$ ./top.sh hello
file1.sh: line 4: fname: readonly function
file2
hobbes@metalbaby:~/scratch/bash-source-test$