Он, забавный!
file=/usr/share/licenses/common/GPL3/license.txt
dict=/usr/share/dict/cracklib-small
while read word; do
grep >/dev/null -i "\<$word\>" $file &&
printf 'Word "%s" found in GPLv3...\n' $word
done < $dict
Вывод:
Word a found in GPLv3...
Word ability found in GPLv3...
Word about found in GPLv3...
(...)
Cracklib-маленький файл идет с пакетом cracklib
http://sourceforge.net/projects/cracklib
Точка в том контексте означает "получать" содержание того файла в текущую оболочку. С source
самостоятельно будучи оболочкой встроенная команда. И source
и причем точечный оператор является синонимами.
Скажите, что у меня было следующее содержание в a sample.sh
файл.
$ cat sample.sh
echo "hi"
echo "bye?"
Теперь, когда я получаю его:
$ . sample.sh
hi
bye?
$
Файлы, такие как это часто используются для слияния команд установки, таких как добавляющие вещи к переменным среды.
Скажите, что у меня были эти команды в другом файле, addvars.sh
.
$ cat addvars.sh
export VAR1="some var1 string"
export VAR2="some var2 string"
Заметьте, что у меня нет переменных в среде моей текущей оболочки.
$ env | grep VAR
$
Теперь, когда я получаю этот файл:
$ . addvars.sh
$
Хорошо, не кажется, что это сделало что-либо, но когда мы проверяем env
переменные снова:
$ env | grep VAR
VAR1=some var1 string
VAR2=some var2 string
Добавить к ответу slm:
Существует два способа выполнить сценарий оболочки. Нужно запустить скрипт в отдельном процессе, что означает, что что-либо о среде оболочки (состояние памяти) вернется к состоянию "родительской" оболочки прежде, чем выполнить "дочерний" процесс оболочки.
Например, текущий рабочий каталог (местоположение в файловой системе, в которой каждый находится) определяется на основе для каждого процесса. Так, давайте иметь сценарий, который похож на это:
#!/bin/bash
cd ~
cd ..
pwd
Так, давайте назовем этот сценарий, о, foo
. И давайте запустим этот скрипт следующим образом: ./foo
Мы будем видеть следующее:
/home
(Стандартная правовая оговорка, что существует большое количество Linux и других дистрибутивов клона UNIX там, некоторые из которых не вставляют каталоги пользователя /home
. Или, поскольку мы раньше говорили, что "Ваш пробег может варьироваться"),
Теперь, после запущения этого скрипта, давайте введем в этой команде
pwd
Видеть, в каком каталоге мы находимся. Мы будем видеть что-то вроде этого:
/home/username
Так как причина была, снова, сценарий оболочки, который мы выполнили, имел свою собственную среду (включая его собственный каталог, куда команды выполнялись), и та среда ушла, после того как сценарий закончил работать.
Теперь, давайте работать foo
сценарий как это
. ./foo
Или, эквивалентно:
source ./foo
Если мы делаем a pwd
впоследствии, мы будем видеть это:
/home
Причем причина: Определение источника сценария не называет отдельный процесс. Это похоже на ввод всех команд в родительском процессе вручную; его среда сохраняется после того, как сценарий заканчивается.
Позвольте мне придумать более простой пример. Давайте иметь сценарий, который похож на это:
#!/bin/bash
exit
Давайте назовем его foo
. Давайте удостоверимся, что мы можем выполнить его: chmod 755 foo
. Затем давайте выполним его как это:
./foo
Ничего не происходит. Однако, с другой стороны, если мы делаем это:
. ./foo
Или это:
source ./foo
Мы выходим из системы.
Период (точка) - короткая рука для баша, встроенного в источник
. Она будет читать и выполнять команды из файла в текущем окружении и возвращать статус выхода последней выполненной команды. Файлы могут находиться в текущем каталоге или в любом другом месте в PATH
. Они не обязательно должны быть исполняемыми.
. (оператор источника или точки)
Чтение и выполнение команд из аргумента имени файла в текущем контексте оболочки.
Syntax
. filename [arguments]
source filename [arguments]
источник является синонимом точки/точки '.' в bash, но не в POSIX sh, поэтому для максимальной совместимости используйте точку.
Когда сценарий запускается с использованием исходного кода, который выполняется в существующей оболочке, любые переменные, созданные или измененные сценарием, останутся доступными после завершения сценария. Напротив, если скрипт запускается просто как имя файла, то для запуска скрипта будет создана отдельная подоболочка (с совершенно отдельным набором переменных ).
Существует небольшая разница между выполнением сценария путем запуска.ss64script (dot ss64script )и. ss64script (точка пробел ss64script)
первый запускает файл, который был скрыт от команды 'ls', (хотя ls -a покажет скрытые файлы )второй вариант выполнит ss64script, даже если он не был установлен как исполняемый файл с помощью chmod.
TL;DR
Точка совпадает с исходной командой.
source — это команда Unix, которая оценивает файл, следующий за командой, как список команд, выполняемых в текущем контексте.
Извлечено изhttps://en.wikipedia.org/wiki/Source_(команда)
# type.
. is a shell builtin
# help.
.:. 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.