В чем разница между выполнением скрипта, подобного этому:
./test.sh
и выполнить скрипт, как это:
. test.sh
?
Я попробовал простой двухстрочный скрипт, чтобы посмотреть, смогу ли я найти разницу:
#!/bin/bash
ls
Но оба . test.sh
и ./test.sh
вернули одну и ту же информацию.
test.sh
это не то же самое, что./test.sh
(первое вызываетPATH
поиск), так. test.sh
и они. ./test.sh
различны (первое вызываетPATH
поиск). Кажется, что многие оболочки неявно включаются.
в концеPATH
при.
поиске пути, но это поведение не является стандартным. Таким образом, точнее сравниватьtest.sh
против. test.sh
и./test.sh
против. ./test.sh
.Ответы:
./test.sh
работаетtest.sh
как отдельная программа. Это может быть сценарий bash, если файлtest.sh
начинается с#!/bin/bash
. Но это может быть что-то совсем другое.. ./test.sh
выполняет код файлаtest.sh
внутри запущенного экземпляра bash. Он работает так, как будто файл содержимогоtest.sh
был включен в текстовом формате вместо. ./test.sh
строки. (Почти: есть некоторые детали, которые отличаются, например, значение$BASH_LINENO
и поведениеreturn
встроенного.)source ./test.sh
идентичен. ./test.sh
in bash (в других оболочкахsource
может немного отличаться или не существовать вообще;.
включение включено в стандарт POSIX).Наиболее заметная разница между выполнением отдельного сценария со встроенным сценарием
./test.sh
и включением в него.
заключается в том, что еслиtest.sh
сценарий устанавливает некоторые переменные среды с отдельным процессом, то устанавливается только среда дочернего процесса, тогда как при включении сценария среда единственного процесса оболочки установлен. Если вы добавите строкуfoo=bar
вtest.sh
иecho $foo
в конце вызывающего скрипта, вы увидите разницу:источник
echo $$
в скрипт покажет разницу довольно четко.$$
Переменная содержит PID текущей оболочки.. ./test.sh
вызова из другого сценария оболочки для использования функций, описанных в test.sh. Я имею в виду, что вы можете устанавливать не только переменные, вы также можете создавать новые функции, которые затем можно вызывать из bash или другого скрипта.. /usr/libexec/company/tools; custom_command "variable
"Запуск сценария первым способом запускает его как дочерний процесс. Sourcing (второй способ), с другой стороны, запускает сценарий, как если бы вы ввели все его команды в текущую оболочку - если сценарий устанавливает переменную, он останется установленным, если сценарий завершится, сеанс завершится. Смотрите
help .
документацию.источник
Еще одна вещь, на которую я обращаю внимание, это то, что если у вас есть псевдоним:
При этом
./test.sh
вы получите нормальныйls
вывод (и PID, отличный от текущей оболочки):С помощью
. test.sh
или. ./test.sh
вы получите более подробный вывод (и тот же PID, что и у текущей оболочки):источник
.bashrc
if [ -f ~/.bash_aliases ]; then . ~/.bash_aliases fi
Затем, вставьте свои псевдонимы.bash_aliases
.alias
ключевое слово? (Может быть, это просто ошибка в вашем посте - в строке 3?)Основное использование для меня
source
(или.
) - это функции bash .У меня есть скрипты со многими функциями, и я выполняю их все с помощью своих
.bashrc
. Функции «становятся» командами, которые я часто использую.источник