./ против для запуска программ под терминалом

Мне нужно уточнить, как мы запускаем исполняемые файлы под терминалом. Это может быть глупый вопрос, но в чем разница между запуском исполняемого файла с ./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 в командной строке.

Другие вопросы по тегам