Replacement for source in sh
Solution 1:
The dot command '.
' is the equivalent of the C Shell (and Bash) source
command. It is specified by POSIX (see dot
), and supported by the Bourne and Korn shells (and zsh
, I believe).
. somefile
Note that the shell looks for the file using $PATH
, but the file only has to be readable, not executable.
As noted in the comments below, you can of course specify a relative or absolute pathname for the file — any name containing a slash will not be searched for using $PATH
. So:
. /some/where/somefile
. some/where/somefile
. ./somefile
could all be used to find somefile
if it existed in the three different specified locations (if you could replace .
with ls -l
and see a file listed).
Pedants of the world unite! Yes, if the current directory is the root directory, then /some/where/somefile
and ./some/where/somefile
would refer to the same file — with the same real path — even without links, symbolic or hard, playing a role (and so would ../../some/where/somefile
).
Solution 2:
tl;dr With sh
(as opposed to bash
) the argument must contain a slash: source ./script.sh
, not just source script.sh
. Unless script.sh
can be found in PATH
.
Dot (.
) command exists in both bash
and sh
. Additionally, bash
aliases it as source
. From bash
manual:
https://www.gnu.org/software/bash/manual/html_node/Bash-Builtins.html#index-source
source
source filename
A synonym for
.
(see Bourne Shell Builtins).
https://www.gnu.org/software/bash/manual/html_node/Bourne-Shell-Builtins.html#index-_002e
. (a period)
. filename [arguments]
Read and execute commands from the
filename
argument in the current shell context. Iffilename
does not contain a slash, thePATH
variable is used to find filename. When Bash is not in POSIX mode, the current directory is searched iffilename
is not found in$PATH
.
From POSIX:
If
file
does not contain a/
, the shell shall use the search path specified byPATH
to find the directory containing file. Unlike normal command search, however, the file searched for by the dot utility need not be executable.