Difference between ". myscript" and "./myscript"
help source
says:
source: source filename [arguments]
Execute commands from a file in the current shell.
Read and execute commands from FILENAME in the current shell. The
entries in $PATH are used to find the directory containing FILENAME.
If any ARGUMENTS are supplied, they become the positional parameters
when FILENAME is executed.
Exit Status:
Returns the status of the last command executed in FILENAME; fails if
FILENAME cannot be read.
source
is a synonym for .
, that means you can write both
. myshellscript
or
source myshellscript
What they do: source
reads every line of the file (line by line) and executes it in the current shell.
But ./myshellscript
executes the file in the current directory if it has the rights to do so. This could also be
/tmp/foo/bar/myshellscript
(to execute the file myshellscript
which is in the directory /tmp/foo/bar
) or
/usr/local/bin/myshellscript
That means, that here the dot is just the current directory. Therefore ./myshellscript
executes the file called myshellscript
in the current directory.
For example try
cd .
which changes to the current directory (no real change ;-)) or
ls .
which lists the content of the current directory.
And as @Alvin Wong commented: You can try this script
#!/bin/foobarNonExisting
echo "This is the Shell that executes me:"
echo $SHELL
with .
or source
to see, that it does not read the shebang. It just uses your current shell. Executing the script itself would lead to an error.
In bash, .
and source
functionally perform the same job -- running a script inside the current shell.
./foo
runs inside another shell, as your shell forks before execution.
If your script should be portable, always use .
. source
is a bash synonym, but it does not exist in POSIX.
Others have said the difference is sourcing vs executing but no one has outlined the functional differences.
The biggest functional difference is that exit
, cd
, and variable assignments will affect the currently running shell if you source it, but not if you execute it. To demonstrate, try the following:
$ cat test.sh
#!/bin/bash
mkdir -p test
cd test
pwd
foo=bar
echo script foo: $foo
$ ./test.sh
/Users/kevin/test
script foo: bar
$ echo $foo
$ pwd
/Users/kevin
$ . test.sh
/Users/kevin/test
script foo: bar
$ echo $foo
bar
$ pwd
/Users/kevin/test
$
Now try this:
$ cat test.sh
#!/bin/bash
exit
$ ./test.sh
$ . test.sh
[Process completed]
As you can see, exit
in an executed script will finish that script, but if you source a script with exit
, it will exit your current shell!