0

I saw the command like ". test.sh" in some shell source code, but I don't know what it does. So, I have tried this. And, that .sh file is executed.

However, I don't understand how "." works. Can you explain?

2 Answers2

4

The . command (which has a synonym, source, in bash, but not in most other Bourne shell derivatives) reads the named file as part of the current shell.

Consider:

$ cat test.sh
export ENVVAR="Welcome"
echo $ENVVAR
$ echo $ENVVAR

$ test.sh
Welcome
$ echo $ENVVAR

$ . test.sh
Welcome
$ echo $ENVVAR
Welcome
$

NB: Cheat 1: I assume test.sh is executable. Cheat 2: I assume test.sh is in a directory on $PATH.

It means that environment variables set in test.sh affect the current shell. By contrast, executing a command without the . does not affect the environment of the current shell. The . mechanism is used when .profile and related files are read, for example.

Note that . looks for simple names (like test.sh with no slash in it) on PATH, but the file only has to be readable; it does not have to be executable.

Jonathan Leffler
  • 5,003
  • 1
  • 30
  • 37
  • Note that when `bash` is not in POSIX mode, `.`/`source` also checks the current directory if no file is found using `PATH`. – chepner Mar 23 '13 at 15:31
  • @chepner: That's entirely plausible. I haven't bothered to experiment with whether the current directory is searched first or last. For the most part, it is not important to this question, which is about the high-level difference between sourcing and executing a script. I agree, though, that it does matter if you're going to make a bullet-proof system depending on such a script. – Jonathan Leffler Mar 23 '13 at 18:30
3

It's a shorthand for this, nothing more:

source test.sh

http://ss64.com/bash/period.html

Matt Ball
  • 3,752
  • 2
  • 25
  • 27
  • 3
    The `dot` command pre-dates the `source` command by years. It was in the original Bourne shell. The C shell had the `source` command for the same job; `bash` imported that as a synonym for `.` some time later. – Jonathan Leffler Mar 23 '13 at 15:16