I need to set the environment variables, usually we do this by
source script.sh
But now, I am automating it during the boot process and it looks like the root boots by default with sh shell. How do I source this script in sh?
I need to set the environment variables, usually we do this by
source script.sh
But now, I am automating it during the boot process and it looks like the root boots by default with sh shell. How do I source this script in sh?
On
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 filenameA 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
filenameargument in the current shell context. Iffilenamedoes not contain a slash, thePATHvariable is used to find filename. When Bash is not in POSIX mode, the current directory is searched iffilenameis not found in$PATH.
From POSIX:
If
filedoes not contain a/, the shell shall use the search path specified byPATHto find the directory containing file. Unlike normal command search, however, the file searched for by the dot utility need not be executable.
The dot command '
.' is the equivalent of the C Shell (and Bash)sourcecommand. It is specified by POSIX (seedot), and supported by the Bourne and Korn shells (andzsh, I believe).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:could all be used to find
somefileif it existed in the three different specified locations (if you could replace.withls -land see a file listed).Pedants of the world unite! Yes, if the current directory is the root directory, then
/some/where/somefileand./some/where/somefilewould 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).