В чем разница между выполнением сценария Bash и его использованием?

В чем разница между выполнением сценария Bash, например A, и использованием сценария Bash типа B?

A > ./myscript B > source myscript 

  • Почему «dd» не работает для создания загрузочного USB?
  • Mount cifs для 2 пользователей
  • Установить внешний вид PuTTY в Windows
  • Какие виртуальные машины существуют для Linux помимо VirtualBox?
  • Почему Dropbox использует так много памяти в Linux?
  • Linux ping фактически не отправляет 1 пакет в секунду
  • Проблемы с Wi-Fi-соединением решены; Почему мое «исправление» работает?
  • Как я могу уменьшить логический том и перераспределить освобожденное пространство в новый раздел на одном диске?
  • 7 Solutions collect form web for “В чем разница между выполнением сценария Bash и его использованием?”

    Короткий ответ: sourcing будет запускать команды в текущем процессе оболочки. Выполнение будет запускать команды в новом процессе оболочки. Все еще запутался? То, пожалуйста, продолжайте читать длинный ответ.

    Терминология:

    Чтобы прояснить некоторую общую путаницу в отношении синтаксиса для выполнения и синтаксиса источника:

     ./myscript 

    Выполнение myscript при условии, что файл является исполняемым и находится в текущем каталоге. Ведущая точка-косая черта ( ./ ) обозначает текущий каталог. Это необходимо, потому что текущий каталог обычно не находится в $PATH .

     myscript 

    Выполнить myscript если файл является исполняемым и находится в каком-то каталоге в $PATH .

     source myscript 

    Источник myscript . Файл не должен быть исполняемым, но он должен быть допустимым сценарием оболочки. Файл может находиться в текущем каталоге или в каталоге в $PATH .

     . myscript 

    Источник myscript . Этот синтаксис определяется POSIX . Bash определил source как псевдоним для команды dot.

    Демонстрация:

    Рассмотрим myscript.sh со следующим содержимым:

     #!/bin/sh # demonstrate setting a variable echo "foo: "$(env | grep FOO) export FOO=foo echo "foo: "$(env | grep FOO) # demonstrate changing of working directory echo "PWD: "$PWD cd somedir echo "PWD: "$PWD 

    Прежде чем мы сначала выполним сценарий, мы проверим текущую среду:

     $ env | grep FOO $ echo $PWD /home/lesmana 

    Переменная FOO не определена, и мы находимся в домашнем каталоге.

    Теперь мы выполним файл:

     $ ./myscript.sh foo: foo: FOO=foo PWD: /home/lesmana PWD: /home/lesmana/somedir 

    Проверьте среду снова:

     $ env | grep FOO $ echo $PWD /home/lesmana 

    Переменная FOO не установлена, и рабочий каталог не изменился.

    Вывод сценария ясно показывает, что переменная была установлена, и каталог был изменен. После этого проверка показывает, что переменная не установлена, и каталог не изменился. Что случилось? Изменения были внесены в новую оболочку. Текущая оболочка породила новую оболочку для запуска скрипта. Скрипт запущен в новой оболочке, и все изменения в среде вступают в силу в новой оболочке. После выполнения сценария новая оболочка будет уничтожена. Все изменения в среде в новой оболочке будут уничтожены с помощью новой оболочки. В текущей оболочке печатается только выходной текст.

    Теперь мы отправляем файл:

     $ source myscript.sh foo: foo: FOO=foo PWD: /home/lesmana PWD: /home/lesmana/somedir 

    Проверьте среду снова:

     $ env | grep FOO FOO=foo $ echo $PWD /home/lesmana/somedir 

    Переменная FOO установлена ​​и рабочий каталог изменен.

    Поиск сценария не создает новую оболочку. Все команды запускаются в текущей оболочке, и изменения в среде вступают в силу в текущей оболочке.

    Обратите внимание, что в этом простом примере вывод выполнения такой же, как и поиск сценария. Это не всегда так.

    Еще одна демонстрация:

    Рассмотрим следующий сценарий pid.sh :

     #!/bin/sh echo $$ 

    (Специальная переменная $$ расширяется до PID текущего запущенного shell-процесса)

    Сначала напечатайте PID текущей оболочки:

     $ echo $$ 25009 

    Источник сценария:

     $ source pid.sh 25009 

    Выполните сценарий, обратите внимание на PID:

     $ ./pid.sh 25011 

    Источник снова:

     $ source pid.sh 25009 

    Выполните повторное выполнение:

     $ ./pid.sh 25013 

    Вы можете видеть, что поиск сценария выполняется в том же процессе, в то время как выполнение скрипта создает новый процесс каждый раз. Этот новый процесс представляет собой новую оболочку, созданную для выполнения скрипта. Поиск сценария не создает новую оболочку, и поэтому PID остается неизменным.

    Резюме

    И поиск источников, и выполнение скрипта будут запускать команды в сценарии по очереди, как если бы вы вводили эти команды вручную по строкам.

    Различия заключаются в следующем:

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

    Используйте источник, если вы хотите, чтобы сценарий изменил среду в текущей рабочей оболочке. Использование выполняется иначе.


    Смотрите также:

    Выполнение скрипта выполняется в отдельном дочернем процессе, т. Е. Для обработки сценария вызывается отдельный экземпляр оболочки. Это означает, что любые переменные среды и т. Д., Определенные в скрипте, не могут быть обновлены в родительской (текущей) оболочке.

    Поиск сценария означает, что он анализируется и выполняется самой текущей оболочкой. Это похоже на то, что вы ввели содержимое скрипта. По этой причине исходный сценарий не обязательно должен исполняться. Но он должен быть исполняемым, если вы его выполняете, конечно.

    Если у вас есть позиционные аргументы в текущей оболочке, они не изменяются.

    Поэтому, если у меня есть файл a.sh содержащий:

     echo a $* 

    и я делаю:

     $ set `date` $ source ./a.sh 

    Я получаю что-то вроде:

     a Fri Dec 11 07:34:17 PST 2009 

    В то время как:

     $ set `date` $ ./a.sh 

    дает мне:

     a 

    Надеюсь, это поможет.

    Sourcing по существу то же самое, что вводить каждую строку скрипта в командной строке по одному за раз …

    Выполнение запускает новый процесс, а затем запускает каждую строку скрипта, только изменяя текущую среду на то, что она возвращает.

    Вы получаете все дополнительные переменные, определенные в скрипте.
    Поэтому, если у вас есть конфигурации или определения функций, вы должны использовать и не выполнять. Казни независимы от среды родителей.

    В дополнение к выше, для выполнения сценария как ./myscript требуется разрешение на выполнение для файла myscript, а для источника не требуется разрешение на выполнение. Вот почему chmod +x myscript не требуется перед source myscript

    Если я правильно помню, выполнение сценария запускает исполняемый файл в #! Строка с файлом сценария в качестве аргумента (как правило, запуск новой оболочки и эффективное использование сценария в новой оболочке, например, с помощью #!/bin/sh );
    В то время как поиск сценария выполняет каждую строку в текущей среде оболочки, что полезно для изменения текущей оболочки (например, предоставления способа определения функций оболочки и переменных внешней среды экспорта).

    source команда выполняет предоставленный сценарий (исполняемое разрешение не является обязательным ) в текущей среде оболочки, а. ./ Выполняет предоставленный исполняемый скрипт в новой оболочке.

    Кроме того, проверьте этот ответ, например: https://superuser.com/a/894748/432100

    Interesting Posts

    Командная строка для поиска файлов в папке в папках в проводнике Windows

    Поддерживает ли Mac OS X журнал сетевых адресов и дат / времени?

    Есть ли простой способ разделить mp3-файлы?

    Модернизация ноутбука

    Как я могу сделать Firefox Password Manager более интеллектуальным?

    Неправильный язык ввода клавиатуры на экране блокировки Windows 8

    У Youtube нет голоса, но музыка продолжается отлично?

    Должен ли я получить интегрированную графику, если у меня уже есть выделенный графический процессор?

    Блокировка файла хоста, доступная для всех компьютеров в локальной сети

    Как скопировать файл с именем, начинающимся с точки?

    Почему Internet Explorer не относится к любым таблицам стилей?

    Может ли PSU перезагрузить компьютер?

    Что означают цифры 240 и 360 при загрузке видео? Как узнать, какое видео более сжато?

    WD «Мой паспорт» не может быть обнаружен на Lenovo T450

    Пакетное изменение кодировки файлов ascii с utf-8 на iso-8859-1

    Давайте будем гением компьютера.