Почему ./a.out работает, но a. вне не? [duplicate]

На мой взгляд, даже простой a.out на терминале содержит полную информацию о файл находится в текущем каталоге. Повторение этого с ./ a.out кажется излишним.

Почему нам нужно указать, что файл находится в текущем каталоге, чтобы выполнить его?

2
задан 18 July 2020 в 06:26

3 ответа

Почему мы должны указать, что файл находится в текущем каталоге, чтобы выполнить его?

Поведение оболочки стандартизировано POSIX, и есть также причина безопасности для не распознавания исполняемых файлов в текущей рабочей среде. каталог. И a.out сам по себе не рассказывает полную историю.

В частности, это определяется как стандартное поведение в стандарте POSIX языка командных команд оболочки, раздел Поиск и выполнение команд после все специфичные для оболочки расширения и перенаправления, а также встроенные поиски были выполнены:

В противном случае необходимо выполнить поиск команды с использованием переменной среды PATH, как описано в томе Базовых определений стандарта IEEE Std 1003.1-2001, глава 8, Переменные окружения:

Что касается a.out , что касается оболочки, то это просто строка текста. В зависимости от того, как организована строка текста, оболочке необходимо удалить перенаправления, замены переменных и расширения; все, что останется после этого, является «командой», которая может быть или не быть встроенной. a.out не является встроенной в какую-либо обычную оболочку, так что именно здесь ./ вступает в игру.

Конечно, вы можете добавить . переменную PATH , и она будет работать - тогда вы сможете вызвать a.out . Но это очень плохая практика и риск для безопасности: см. Безопасно ли добавлять. в мой путь? Как получилось? .

Другими словами, нет, это не лишнее. Это просто, как оболочки должны работать, и это существует по технической причине.


примечание 1: bash также принимает поле нулевой длины в PATH , согласно руководству bash (1) :

Имя каталога нулевой длины (нулевое) в значении PATH указывает текущий каталог. Пустое имя каталога может отображаться в виде двух соседних двоеточий или как начальное или конечное двоеточие.

примечание 2: Другое преимущество использования ./ состоит в том, чтобы избежать путаницы с системными утилитами, которые имеют то же имя с локальным исполняемым файлом. Хотя в этом конкретном вопросе конкретно говорится об имени исполняемого файла a.out (которое присваивается автоматически при компиляции кода C), что произойдет, если один скомпилирует код и назовет выходной исполняемый файл test (т. Е. gcc -o test test.c создает исполняемый test , и вы называете test , а не . / test как команда в оболочке)?

Оболочка найдет / usr / bin / test на основе / usr / bin , перечисленного в PATH и выполните этот конкретный двоичный файл, а не исполняемый файл с именем test в вашем текущем рабочем каталоге. Фактически, я уже отвечал на вопрос об этой конкретной ситуации: В чем разница между «test» и «test.sh» при запуске сценариев оболочки?

4
ответ дан 30 July 2020 в 22:05

Из man bash :

COMMAND EXECUTION
       After a command has been split into words, if it results in a simple command
       and an optional list of arguments, the following actions are taken.

       If the command name contains no slashes, the shell attempts to locate it.
       If there exists a shell function by that name, that function is invoked as
       described above in FUNCTIONS. If the name does not match a function, the
       shell searches for it in the list of shell builtins. If a match is found,
       that builtin is invoked.

       If the name is neither a shell function nor a builtin, and  contains no
       slashes, bash searches each element of the PATH for a directory containing
       an executable file by that name.

Другими словами, если вы вызываете исполняемый файл без ведущего ./ , оболочка будет искать команду в PATH и не сможет найти команду потому что текущий каталог не находится в вашем PATH. Если вы добавите текущий каталог в вашу переменную PATH, вы можете вызвать исполняемый файл без начального значения .

3
ответ дан 30 July 2020 в 22:05

Это будет зависеть от того, кем вы являетесь $ PWD.

./ a .out говорит системе искать a.out в текущем каталоге, так как вы указали путь к файлу a.out

a.out будет работать, только если $ PWD (ваш текущий рабочий каталог) находится в $ PATH или в каталогах, в которых выполняется поиск двоичных файлов.

Ваш текущий каталог ищется только в том случае, если он указан в полях поиска, что уменьшает количество ошибок и потенциально повышает безопасность, избегая ошибок.

4
ответ дан 30 July 2020 в 22:05

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

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