В чем разница между '.' и «источник» в оболочках?

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

Я использовал и команду dot. и «источник» для перезагрузки данного файла rc (как правило, для обновления моих переменных среды), но я не уверен, что они разные, и если один из них предпочтительнее. Какая разница между двумя ?

. это команда оболочки Bourne и POSIX, а source является команда C-Shell.

Некоторые производные Bourne-shell, такие как bash , zsh и большинство реализаций ksh также имеют команду source которая обычно является псевдонимом . хотя для ksh с различиями.

Для bash и zsh,. и source ведут себя одинаково, но их поведение зависит от того, работают ли они в режиме POSIX или нет.

POSIX требует, чтобы . команда выходит из оболочки, если она не может открыть файл для чтения и требует, чтобы файл был найден путем поиска каталогов в $PATH если предоставленный путь не содержит / .

zsh и bash . и source ведет себя так, как POSIX требует, когда в режиме POSIX, и как source pdksh, когда нет, то есть они не выходят из сценария, если они не могут открыть файл для чтения (то же самое, что и command . ) и искать файл в $PATH и текущий каталог, если предоставленный путь не содержит / .

source AT & T ksh не выходит из оболочки, но не ищет файл в текущем каталоге.

В общем, в Bourne-подобных оболочках (хотя и не в оболочке Bourne, у которой нет встроенной command ), если вы хотите последовательного поведения, вы можете сделать

 command . the-file-to-source || handle-error 

И если файл-источник должен находиться в текущем каталоге, обязательно напишите:

 command . ./the-file-to-source || handle-error 

В сценариях sh (где sh – POSIX sh ) вы должны полагаться на поведение POSIX, указанное выше.


¹ zsh и bash включить режим POSIX при вызове sh . Для bash также когда он получает POSIXLY_CORRECT в своей среде (даже если он называется bash, даже если нет команды POSIX, называемой bash ) или когда он получает SHELLOPTS=posix или когда SHELLOPTS=posix с bash --posix или bash -o posix или после set -o posix . С помощью zsh вы используете emulate sh для эмуляции sh . Эмуляции изменяют целую кучу опций, которые изменяют поведение zsh. В этом случае опция POSIX_BUILTINS .

В bash вы можете проверить, находится ли в режиме POSIX или нет с командой (non-POSIX), [ -o posix ] . В zsh вы проверяете вывод emulate чтобы увидеть, есть ли у вас эмуляция sh , или [[ -o posixbuiltins ]] чтобы проверить, включен ли этот конкретный параметр. Вы также можете временно включить данный режим эмуляции с эмуляцией emulate -L (для эмуляции только в текущей локальной области).

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