В скрипте bash что означает точка, затем пробел, а затем путь?

83

Я сталкивался с этим примером, когда пытался смонтировать USB-устройство в контейнере openvz, и никогда раньше не видел конструкции во второй строке. Можете ли вы объяснить, что это значит?

#!/bin/bash
. /etc/vz/vz.conf
Денис Коннолли
источник

Ответы:

98

Это синоним встроенного source. Он будет выполнять команды из файла в текущей оболочке , как чтение из help sourceили help ..

В вашем случае файл /etc/vz/vz.confбудет выполнен (очень вероятно, что он содержит только назначения переменных, которые будут использоваться позже в скрипте). Он отличается от простого выполнения файла, например, /etc/vz/vz.confмногими способами: наиболее очевидным является то, что файл не должен быть исполняемым; тогда вы подумаете о том, чтобы запустить его, bash /etc/vz/vz.confно он будет выполняться только в дочернем процессе, и родительский скрипт не увидит никаких изменений (например, переменных), которые делает дочерний процесс.

Пример:

$ # 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
$

Надеюсь это поможет.

gniourf_gniourf
источник
14
Просто примечание: .будет работать в большинстве оболочек (sh, ash, ksh и т. Д.), sourceСпециально для bash.
Дмитрий Сиренко
3
@EarlGray source- это не просто bash, а оболочка в стиле C ( csh, tcsh) и zsh. .работает в оболочках в стиле Борна, в том числе перечисленных . Учитывая, что bash - это оболочка в стиле Борна, и вряд ли какой-либо нетривиальный сценарий bash может выполняться в оболочке в стиле C, его правда .следует считать гораздо более переносимым. Но sourceсиноним bash .существует частично для переносимости.
Элия ​​Каган,
1
@EliahKagan да, ты прав; лучше сказать, что .он универсален и sourceшироко распространен, но не работает в простом виде sh.
Дмитрий Сиренко
5

Когда скрипт запускается с использованием `source ', он запускается в существующей оболочке, любые переменные, созданные или измененные скриптом, останутся доступными после его завершения.

Синтаксис имя файла [аргументы]

  source filename [arguments]
Sureshkumar
источник