В чем разница между поиском ('.' Или 'source') и выполнением файла в bash?

В чем разница между выполнением скрипта следующим образом:

./test.sh

и выполняя скрипт следующим образом:

. test.sh . test.sh ?

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

 #!/bin/bash ls 

Но и то и другое . test.sh . test.sh и ./test.sh вернули ту же информацию.

4 Solutions collect form web for “В чем разница между поиском ('.' Или 'source') и выполнением файла в bash?”

./test.sh запускает test.sh как отдельную программу. Это может быть сценарий bash, если файл test.sh начинается с #!/bin/bash test.sh #!/bin/bash . Но это может быть совсем другое.

. ./test.sh . ./test.sh выполняет код файла test.sh внутри исполняемого экземпляра bash. Он работает так, как если бы файл содержимого test.sh был включен в текст вместо него . ./test.sh . ./test.sh . (Почти: есть несколько деталей, которые отличаются, например, значение $BASH_LINENO и поведение встроенного return .)

source ./test.sh идентичен . ./test.sh . ./test.sh в bash (в других оболочках source может быть несколько иным или вообще не существовать, для включения в стандарт POSIX).

Наиболее часто видимая разница между запуском отдельного скрипта с ./test.sh и включением скрипта в . что скрипт test.sh задает некоторые переменные среды, с отдельным процессом, устанавливается только среда дочернего процесса, тогда как при включении скрипта устанавливается среда единственного процесса оболочки. Если вы добавите строку foo=bar в test.sh и echo $foo в конце вызывающего скрипта, вы увидите разницу:

 $ cat test.sh #!/bin/sh foo=bar $ ./test.sh $ echo $foo $ . ./test.sh $ echo $foo bar 

Запуск сценария первым способом запускает его как дочерний процесс. Sourcing (второй способ), с другой стороны, запускает скрипт так, как если бы вы ввели все его команды в текущую оболочку – если скрипт устанавливает переменную, он останется установленным, если скрипт завершится, ваш сеанс завершится. См. help . для документации.

Еще одна вещь, которую я отмечаю, заключается в том, что если у вас есть псевдоним вроде этого:

 # add into .bashrc_aliases alias ls='ls -lht' 

С ./test.sh вы получите нормальный вывод ls (и другой PID, чем текущая оболочка):

 auraham@pandora:~/iso$ ./test.sh dsl-4.4.10.iso test.sh 3136 # PID 

С. . test.sh или . ./test.sh . ./test.sh вы получите более подробный вывод (и тот же PID, что и текущая оболочка):

 auraham@pandora:~/iso$ echo $$ 2767 # shell PID auraham@pandora:~/iso$ . test.sh total 50M drwxrwxr-x 2 auraham auraham 4.0K Jul 30 15:41 . -rwxrwxr-x 1 auraham auraham 32 Jul 30 15:41 test.sh drwxr-xr-x 50 auraham auraham 4.0K Jul 30 15:30 .. -rw-rw-r-- 1 auraham auraham 50M Jul 28 17:24 dsl-4.4.10.iso 2767 # PID 

Основное использование для source (или . ) – это функции bash .

У меня есть сценарии со многими функциями, и я выполняю их все с помощью моего .bashrc . Функции «становятся» командами, которые я часто использую.

  • Как определить функцию `bc` для последующего использования?
  • Командный поток команды Shell Script перезаписывает старые строки
  • выполнение сценария sh из cron
  • «Нет такого файла» с ksh, но скрипт работает с ksh -x?
  • зацикливание команды без ожидания первого запуска
  • Мультиплексные копии scp
  • Скопируйте файлы, найденные с помощью find?
  • Как я могу поделиться оболочкой с моим коллегой без использования VNC?
  • Количество и список вниз + расширенные функции
  • &> перенаправление не работает правильно
  • Команда ls: что означает первая строка?
  • Не удается получить доступ к внешнему жесткому диску.
  • Interesting Posts

    Отображение идентификатора NFS не работает для всех каталогов

    Nemo не запрашивает подтверждение при удалении

    Использование inode не соответствует счету

    Поиск и удаление файлов с определенной датой

    Centos 6.6 не загружается на Virtualbox на хосте Windows

    Когда применяется правило отказа NGINX?

    Могу ли я установить цвета терминала на локальном компьютере, чтобы использовать те, которые были в машине I ssh?

    Docker Debian Jessie: не удается найти / var / log / syslog

    почему местная авария убила мои удаленные задания?

    Как установить пакеты с F17?

    загрузка жесткого диска nfs занимает очень много времени

    Элементарная ошибка перезагрузки iMac в конце 2009 года

    Как быстро генерировать (небезопасные) ключи GPG?

    Как создать нового пользователя без собственной FS, но с доступом к записи только в одну папку пользователя, которая его создает?

    Сколько времени занимает установка Linux Mint?

    Linux и Unix - лучшая ОС в мире.