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