Пересматривание Bash по сравнению с Исходным различием

Я хочу задать вопрос об ударе и источнике.

Я подтверждаю, что они оба используются с .sh дополнительными файлами такой как

bash setup.sh
source setup.sh

Однако я хотел знать различие между теми двумя, если можно было бы объяснить.

Существует сообщение Используя источник по сравнению с командами удара, которые попытались объяснить, но я не мог разъясниться, пытался ли респондент сказать, что "источник" игнорирует прошлое определение и устанавливает переменные среды в текущей оболочке, или удар игнорирует прошлое определение и устанавливает переменные среды в текущей оболочке.

Если бы можно было бы предоставить лучшее описание различия между источником и ударом, который был бы большим также.

Спасибо!

1
задан 26 November 2018 в 20:19

2 ответа

Ссылка, которую Вы предоставили, не упоминает "прошлое определение", вероятно, потому что это не имеет значения. source работает в текущей оболочке и может влиять на переменные в текущей оболочке. bash вызывает новую оболочку, и та оболочка не может влиять на среду своего родителя. Кроме того, .sh расширение является абсолютно дополнительным и конкретно не используется в файлах инициализации оболочки.

4
ответ дан 3 December 2019 в 06:24

Что происходит, когда Вы работаете 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, переменная нечто установлена (и заменена), каждый раз.

3
ответ дан 3 December 2019 в 06:24

Другие вопросы по тегам:

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