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

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

./test.sh

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

. test.sh . test.sh ?

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

 #!/bin/bash ls 

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

  • Проверка значения переменных среды в Makefile
  • sh -c не получает правильный вывод при выполнении сценария оболочки
  • bash while loop не печатает, что ожидается
  • Как захватить только stderror в этом сценарии bash?
  • Как изменить оболочку cron (sh на bash)?
  • Как я могу получить результат и проверить команду dig?
  • Подача звука с микрофона в питон
  • Как я могу «изолировать» сценарий оболочки?
  • 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 . Функции «становятся» командами, которые я часто использую.

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