Мне нужно уточнить, как мы запускаем исполняемые файлы под терминалом. Это может быть неубедительный вопрос, но в чем разница между запуском исполняемого файла ./an_executable
и . an_executable
(предположим, что мы находимся в каталоге, где находится an_executable)
Я уже знаю, что первое заставляет оболочку искать an_executable в текущем каталоге ( .
), но почему /
после .
использования последней версии это не нужно ?
Заранее спасибо.
command-line
executable
ZipZap
источник
источник
Ответы:
. executable
Синтаксис не работает только с любым исполняемым (или делает это?). Это псевдонимsource
встроенного bash . Так что разница в основном касается скриптов bash, и правда в том, что они совершенно разные вещи :)./executable
просит запустить исполняемый файл "нормально"../
является относительной ссылкой на текущий путь. Это позволяет избежать попыток оболочки (bash) найти исполняемый файл в каталоге, в$PATH
котором он находится (что было бы, если бы вы вообще не указали путь с помощью команды). Причина, по которой вы не можете просто сделатьexecutable
это одна из причин безопасности; представьте, что вы распаковываете архив, который вы скачали, и он содержит вредоносную версиюls
. Если бы он запускался прямо из вашего текущего каталога, вы бы запустили эту версию, даже не подозревая об этом.С другой стороны,
. executable
говорит "источник файла с именемexecutable
". Поскольку вы прямо называете файл, и он действительно не должен быть исполняемым, ограничение безопасности для $ PATH не применяется. Sourcing будет только "запускать" (или, кажется, запускать) сценарии оболочки. Что это делает:Итак ... В чем разница между исполнением и поиском? Предполагая, что тот же сценарий оболочки, выполнение it (
./script
) порождает новую оболочку, запускает сценарий внутри этой оболочки, а когда сценарий завершается, закрывает эту оболочку и возвращается к родительской оболочке. По сути, он запустит новыйbash
процесс для выполнения скрипта).(
. script
) заставит текущую оболочку читать команды из файла, как если бы они вводились в командной строке. Там нет новой оболочки порожденной.Очень простой способ увидеть, как это ведет себя, - написать скрипт, который содержит только
exit
. Если вам./script
это кажется, ничего не произойдет, это потому, что запущен новый процесс оболочки,exit
команда завершает работу этой новой оболочки и ваша текущая оболочка не изменяется.Если вы
. script
, ваш текущий терминал закроется, потому чтоexit
команда выполняется в текущей оболочке. Так что это эквивалентно вводуexit
в командной строке.источник
ls
вывод: вы набираете команду, она запускается, показывает вывод, а затем заканчивается, но вывод остается в терминале.bash
внутренней оболочкой. Если вы напечатаетеbash
, вы будете запускать другую оболочку; до первой оболочки, это просто программа для запуска. Если вы напечатаетеexit
, вы закроете последнюю оболочку, которую вы запустили, но все равно будете в первой оболочке (той, с которой вы запустили терминал). Опять же, все это происходит в одном терминале.