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.
./foo
. That executes the script, which you usually want. – StackExchange saddens dancek Feb 21 '13 at 14:21