запуск сценарію з „. "Та" джерело "


26
  1. Мені було цікаво, чи еквівалентні наступні два способи запуску bash script?

    . ./myScript.sh
    
    source myScript.sh
    
  2. Чи обидва вони використовують вміст скрипту замість запуску сценарію, тобто не створюють допоміжну оболонку для запуску сценарію?

1
Гей, це на сторінці сторінки!
alex

@ Алекс: покажи мені, будь ласка? man ., man sourceАбо то , що я ще не знаю.
Тім

2
Дивіться type .іhelp .
rozcietrzewiacz

man $SHELL,/source
alex

4
. є більш портативним згідно з іншими.
l0b0

Відповіді:


21
  1. Вони еквівалентні в баші тим, що роблять абсолютно те саме. З іншого боку, sourceна 5 символів довше і не переноситься на оболонки POSIX або Bourne, тоді як .(крапка), тому я ніколи не заважаю користуватися source.

  2. Це правильно - джерело файлу виконує команди в поточній оболонці, і це вплине на ваше поточне середовище оболонки. Ви все одно можете передавати аргументи до джерела, і bash насправді шукатиме $PATHім'я файлу так само, як і звичайна команда, якщо вона не містить косої риски.


Не пов’язано з початковим запитанням щодо .vs source, але у вашому прикладі,

. ./myScript.sh 

не тотожне

source myScript.sh

адже поки .і sourceфункціонально однакові, myScript.shі ./myScript.shне є однаковими. Оскільки ./myScript.shмістить косу рису, вона інтерпретується як шлях, а оболонка просто використовує ./myScript.sh. Однак myScript.shне має нахилу, і оболонка $PATHспочатку шукає її. Це стандартна поведінка для визначеного POSIX. . Більшість оболонок за замовчуванням до цього, хоча вони можуть додавати розширення (наприклад, пошук у поточному робочому каталозі після пошуку шляху) або параметри зміни поведінки ./ source.


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 .
Тім

Тобто вони обидва вбудовані, і псевдонім також побудований. Це задокументовано , але я думаю, що в цьому випадку синонім - це правильний термін, а не «псевдонім».
Калеб
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.