source is an alternative name for the . builtin, but only in some shells. . is in POSIX, it's portable; source is not.
When writing code for sh, one should only use portable shell features. The basic point of writing code for sh is making it work in any implementation of sh. In general sh may be a symlink to bash, dash or some other shell. Even if this shell itself supports source, it may or may not support it when called as sh. And even if this shell itself supports source when called as sh, it's still a bad practice to write non-portable code when you are going to make sh interpret the code.
Maybe your /bin/sh does not support source; if so, it will treat source in source ./sourced.sh like any other not-a-keyword-and-not-a-builtin. Then maybe there is an executable file called source in some directory in your $PATH; if so, the shell will try to run it. Then maybe the mode of the file does not allow you to run it; if so, the error message will be source: Permission denied.
A solution is to use . instead of source. Any sh should understand . in the way you expected your sh to understand source.
Having source as an executable file is (in my opinion) uncommon. The above hypothesis, while plausible, may or may not be what happens in your particular case. Even if the solution does not (or does not fully) solve your particular case, using . instead of source in shell code for sh is still the Right Thing.
.instead ofsource. AFAIK,sourceis not POSIX and may not be available in some shell. – Tom Yan Oct 22 '23 at 04:31