./ против для запуска программ под терминалом
Мне нужно уточнить, как мы запускаем исполняемые файлы под терминалом. Это может быть глупый вопрос, но в чем разница между запуском исполняемого файла с ./an_executable
а также . an_executable
(предположим, что мы находимся в директории, где расположен an_executable)
Я уже знаю, что первое заставляет оболочку искать an_executable в текущем каталоге (.
), но почему не /
нужно после .
при использовании последней версии?
Заранее спасибо.
1 ответ
. executable
синтаксис не работает только с любым исполняемым файлом (или делает это?). Вместо этого это псевдоним для Баш source
встроенный. Так что разница в основном касается скриптов 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
в командной строке.