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

Мне нужно кое-что прояснить относительно того, как мы запускаем исполняемые файлы под терминалом. Это может быть глупый вопрос, но в чем разница между запуском исполняемого файла с ./an_executable и . an_executable (предположим, что мы находимся в каталоге, где находится an_executable)

Я уже знаю, что первый оболочка ищет an_executable в текущем каталоге (.), но почему / не требуется после . при использовании последней версии?

Заранее спасибо.

13
задан 13 February 2015 в 22:13

1 ответ

. 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 на командной строке.

22
ответ дан 13 February 2015 в 22:13
  • 1
    тем не менее ничто..., я думаю, что это - что-то с compiz. Возможно, я shoul удаляю compiz completly и переустановить рабочий стол человечности. Что Вы думаете? – Ludwig Supraphonic 21 June 2016 в 10:59

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

Похожие вопросы: