Каково значение точки перед командой в оболочке?

Он, забавный!

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

88
09.02.2014, 07:18
6 ответов

Точка в том контексте означает "получать" содержание того файла в текущую оболочку. С 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
91
27.01.2020, 19:30

Добавить к ответу 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

Мы выходим из системы.

82
27.01.2020, 19:30
  • 1
    Ваш ответ лучше, чем принятый, я понял, как Вы объяснили, Спасибо! –  Ahmed 25.07.2016, 16:03

Период (точка) - короткая рука для баша, встроенного в источник. Она будет читать и выполнять команды из файла в текущем окружении и возвращать статус выхода последней выполненной команды. Файлы могут находиться в текущем каталоге или в любом другом месте в PATH. Они не обязательно должны быть исполняемыми.

6
27.01.2020, 19:30

. (оператор источника или точки)
Чтение и выполнение команд из аргумента имени файла в текущем контексте оболочки.

Syntax
     . filename [arguments]

      source filename [arguments]

источник является синонимом точки/точки '.' в bash, но не в POSIX sh, поэтому для максимальной совместимости используйте точку.

Когда сценарий запускается с использованием исходного кода, который выполняется в существующей оболочке, любые переменные, созданные или измененные сценарием, останутся доступными после завершения сценария. Напротив, если скрипт запускается просто как имя файла, то для запуска скрипта будет создана отдельная подоболочка (с совершенно отдельным набором переменных ).

Существует небольшая разница между выполнением сценария путем запуска.ss64script (dot ss64script )и. ss64script (точка пробел ss64script)

первый запускает файл, который был скрыт от команды 'ls', (хотя ls -a покажет скрытые файлы )второй вариант выполнит ss64script, даже если он не был установлен как исполняемый файл с помощью chmod.

Источник

3
27.01.2020, 19:30

TL;DR

Точка совпадает с исходной командой.

source — это команда Unix, которая оценивает файл, следующий за командой, как список команд, выполняемых в текущем контексте.

Извлечено изhttps://en.wikipedia.org/wiki/Source_(команда)

3
27.01.2020, 19:30

Как узнать.

# 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.
2
27.01.2020, 19:30

Теги

Похожие вопросы