Я хочу задать вопрос об ударе и источнике.
Я подтверждаю, что они оба используются с .sh дополнительными файлами такой как
bash setup.sh
source setup.sh
Однако я хотел знать различие между теми двумя, если можно было бы объяснить.
Существует сообщение Используя источник по сравнению с командами удара, которые попытались объяснить, но я не мог разъясниться, пытался ли респондент сказать, что "источник" игнорирует прошлое определение и устанавливает переменные среды в текущей оболочке, или удар игнорирует прошлое определение и устанавливает переменные среды в текущей оболочке.
Если бы можно было бы предоставить лучшее описание различия между источником и ударом, который был бы большим также.
Спасибо!
Ссылка, которую Вы предоставили, не упоминает "прошлое определение", вероятно, потому что это не имеет значения. source
работает в текущей оболочке и может влиять на переменные в текущей оболочке. bash
вызывает новую оболочку, и та оболочка не может влиять на среду своего родителя. Кроме того, .sh
расширение является абсолютно дополнительным и конкретно не используется в файлах инициализации оболочки.
Что происходит, когда Вы работаете bash foo.sh
? Новый процесс удара запускает и читает и выполняет команды, которые находятся в foo.sh
. Когда это сделало выполнение команд, этого нового процесса выходы, и Вы возвращаете свою подсказку, отраженную Вашей текущей оболочкой.
Что происходит, когда Вы работаете source foo.sh
(или . foo.sh
)? Вы в основном говорите свою текущую оболочку "вместо того, чтобы читать команды из клавиатуры, читаете команды из этого файла, когда Вы сделаны, возвратитесь к клавиатуре"
Когда это имеет значение? Когда существуют команды, которые изменяют состояние оболочки; например, cd
, exit
, VAR=value
, alias
и некоторые другой.
Предположим foo.sh
содержит это:
mkdir /tmp/bar
Не имеет значения при выполнении его с source
или bash
. Теперь, предположите, что содержание сценария заменяет переменные, затем это имеет значение. Когда Вы работаете bash foo.sh
, новый удар создается, он выполняет команды и выходы; никакое изменение в Вашей оболочке. Если, с другой стороны, Вы source foo.sh
, заменяются Ваши текущие переменные оболочки.
Давайте возьмем пример. Предположим, что в файле существует это foo.sh
:
echo "Currently executing commands from foo.sh"
echo "changing variable foo."
foo=$RANDOM
echo "In shell with PID $$, the value of foo is now >>$foo<<"
echo "End of foo.sh"; echo
Что происходит, если Вы работаете bash foo.sh
и затем echo $foo
? Что происходит, если Вы работаете source foo.sh
и затем echo $foo
?
Попробуйте многократно. Вы заметите это, если Вы будете работать bash foo.sh
, переменная нечто не установлена в Вашей оболочке. если Вы работаете source foo.sh
, переменная нечто установлена (и заменена), каждый раз.