запуск сценария с «. И с «источником»

26
  1. Мне было интересно, если следующие два способа запуска сценария bash эквивалентны?

    . ./myScript.sh
    
    source myScript.sh
    
  2. Они оба запускают содержимое скрипта вместо того, чтобы запускать скрипт, т.е. не создают подоболочку для запуска скрипта?
Тим
источник
1
Эй, это на странице руководства!
Алекс
@alex: покажи мне, пожалуйста? man ., man sourceИли то , что я еще не знаю.
Тим
2
Смотрите type .иhelp .
rozcietrzewiacz
man $SHELL,/source
Алекс
4
, является более портативным в соответствии с другими.
10

Ответы:

21
  1. Они эквивалентны в Bash в том, что они делают то же самое. С другой стороны, sourceон на 5 символов длиннее и не переносится на оболочки только для POSIX или Bourne, тогда как .(точка) есть, поэтому я никогда не буду использовать его source.

  2. Это правильно - получение файла запускает команды в текущей оболочке, и это повлияет на текущую среду оболочки. Вы по-прежнему можете передавать аргументы в исходный файл, и bash фактически будет искать $PATHимя файла, как обычная команда, если она не содержит косых черт.


Не связано с первоначальным вопросом .против source, но в вашем примере,

. ./myScript.sh 

не идентичен

source myScript.sh

потому что пока .и sourceфункционально идентичны, myScript.shа ./myScript.shне одинаковы. Поскольку ./myScript.shсодержит косую черту, он интерпретируется как путь, а оболочка просто использует ./myScript.sh. Однако myScript.shкосой черты нет, поэтому оболочка сначала выполняет $PATHпоиск. Это стандартное поведение, определенное POSIX для .. Большинство оболочек используют это по умолчанию, хотя они могут добавлять расширения (например, поиск в текущем рабочем каталоге после поиска пути) или опции, чтобы изменить поведение ./ source.

jw013
источник
2
поведение, когда указанный путь к файлу не содержит a, /зависит от оболочки bashи zshзависит от того, включен ли режим POSIX или нет. Также обратите внимание, что во многих реализациях ksh .ведет себя иначе, чем source.
Стефан Шазелас
@ StephaneChazelas Да, вы правы. Я добавил примечание, чтобы пояснить, что приведенное выше описание относится к стандарту POSIX.
jw013
8

Да, они эквивалентны. Там нет функциональной разницы; .это просто встроенный синоним для source.

(Edit: Видимо , это верно только для bashи zshнекоторые легкие снаряды не имеют. source, Только .определяется POSIX так ksh, dash, ashи т.д. , могут не иметь sourceСм. Ответ jw013 игровая для информации.)

Калеб
источник
Благодарность! Но $ alias .выходы bash: alias: .: not found .
Тим
То есть они оба встроенные, а псевдоним встроенный. Это задокументировано , но я думаю, что в данном случае правильный термин - это синоним, а не псевдоним.
Калеб