. 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.
Итак ... В чем разница между исполнением и поиском? Предполагая, что тот же сценарий оболочки, выполнение it ( ./script
) порождает новую оболочку, запускает сценарий внутри этой оболочки, а когда сценарий завершается, закрывает эту оболочку и возвращается к родительской оболочке. По сути, он запустит новый bash
процесс для выполнения скрипта).
( . script
) заставит текущую оболочку читать команды из файла, как если бы они вводились в командной строке. Там нет новой оболочки порожденной.
Очень простой способ увидеть, как это ведет себя, - написать скрипт, который содержит только exit
. Если вам ./script
это кажется, ничего не произойдет, это потому, что запущен новый процесс оболочки, exit
команда завершает работу этой новой оболочки и ваша текущая оболочка не изменяется.
Если вы . script
, ваш текущий терминал закроется, потому что exit
команда выполняется в текущей оболочке. Так что это эквивалентно вводу exit
в командной строке.