. 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в командному рядку.