92

I came across this example when trying to mount a usb device inside a openvz container and I have never seen the construct in the second line before. Can you explain what it signifies?

#!/bin/bash
. /etc/vz/vz.conf
Glutanimate
  • 21,183
  • 13
  • 100
  • 153
Denis Connolly
  • 921
  • 1
  • 6
  • 3

2 Answers2

107

It's a synonym of the builtin source. It will execute commands from a file in the current shell, as read from help source or help ..

In your case, the file /etc/vz/vz.conf will be executed (very likely, it only contains variable assignments that will be used later in the script). It differs from just executing the file with, e.g., /etc/vz/vz.conf in many ways: the most obvious is that the file doesn't need to be executable; then you will think of running it with bash /etc/vz/vz.conf but this will only execute it in a child process, and the parent script will not see any modifications (e.g., of variables) the child makes.

Example:

$ # Create a file testfile that contains a variable assignment:
$ echo "a=hello" > testfile
$ # Check that the variable expands to nothing:
$ echo "$a"

$ # Good. Now execute the file testfile with bash
$ bash testfile
$ # Check that the variable a still expands to nothing:
$ echo "$a"

$ # Now _source_ the file testfile:
$ . testfile
$ # Now check the value of the variable a:
$ echo "$a"
hello
$

Hope this helps.

gniourf_gniourf
  • 5,693
  • 2
  • 25
  • 28
  • 16
    Just a note: `.` will work in most shells (sh, ash, ksh, etc), `source` is specific for bash. – Dmytro Sirenko Dec 26 '12 at 22:31
  • 4
    @EarlGray `source` isn't *just* bash--it's in C-style shells ([`csh`](http://manpages.ubuntu.com/manpages/trusty/en/man1/bsd-csh.1.html), [`tcsh`](http://manpages.ubuntu.com/manpages/trusty/en/man1/tcsh.1.html))--and zsh too. `.` works in Bourne-style shells including [those listed](http://askubuntu.com/q/232932#comment288304_232938). Considering that bash is a Bourne-style shell and hardly any bash script of non-trivial complexity is likely to run in a C-style shell, it's true `.` should be considered much more portable. But bash's `source` synonym of `.` exists partly for portability. – Eliah Kagan Oct 08 '14 at 01:14
  • 1
    @EliahKagan yes, you're right; it's better to say that `.` is universally portable and `source` is wide-spread, but does not work in plain `sh`. – Dmytro Sirenko Oct 09 '14 at 11:55
5

When a script is run using `source' it runs within the existing shell, any variables created or modified by the script will remain available after the script completes.

Syntax . filename [arguments]

  source filename [arguments]
Rinzwind
  • 293,910
  • 41
  • 570
  • 710
Sureshkumar
  • 59
  • 1
  • 1