. executable
Синтаксис не працює тільки з будь-яким виконуваним (або робить це?). Натомість це псевдонім для source
вбудованого bash . Тож різниця стосується переважно bash-скриптів, і правда полягає в тому, що вони абсолютно різні речі :)
./executable
просить запустити виконуваний файл "нормально". ./
є відносним посиланням на поточний шлях. Це дозволяє уникнути того, щоб оболонка (bash) намагалася знайти виконуваний файл у каталозі у своєму $PATH
(що це зробило б, якщо ви зовсім не вказали шлях за допомогою команди). Причина, чому ви не можете просто зробити, executable
- це безпека; уявіть, ви розпакуєте завантажений архів, і він містить шкідливу версію ls
. Якщо він запускався безпосередньо з вашого поточного каталогу, ви запустите цю версію, не усвідомлюючи цього.
З іншого боку, . executable
говорить "джерело файлу з іменем executable
". Оскільки ви безпосередньо називаєте файл і він дійсно не повинен бути виконуваним, обмеження безпеки для $ PATH не застосовується. Sourcing буде "запускати" (або, здається, запущені) сценарії оболонки. Що це робить:
source filename [arguments]
Read and execute commands from filename in the current shell
environment and return the exit status of the last command exe‐
cuted from filename.
Отже ... Яка насправді різниця між виконанням та пошуку? Якщо припустити той самий скрипт оболонки, його виконання ( ./script
) породжує нову оболонку, запустить сценарій всередині цієї оболонки, а коли скрипт вийде, закрийте цю оболонку та поверніться до батьківської оболонки. По суті, він запустить новий bash
процес виконання сценарію).
( . script
) призведе до того, що поточна оболонка зчитує команди з файлу так, ніби вони були введені в командному рядку. Не породжена нова оболонка.
Дуже простий спосіб побачити, як це поводиться, - це написати сценарій, який містить лише цей exit
. Якщо ви ./script
це зробите, то, здається, нічого не відбудеться, це тому, що запускається новий процес оболонки, exit
команда закриває цю нову оболонку і вашу поточну оболонку.
Якщо ви . script
, ваш поточний термінал закриється, оскільки exit
команда працює в поточній оболонці. Отже, це рівнозначно набору тексту exit
в командному рядку.