На мой взгляд, даже простой a.out
на терминале содержит полную информацию о файле, находящемся в текущем каталоге. Повторять это с помощью ./ a.out
кажется излишним.
Почему нам нужно указать, что файл находится в текущем каталоге, чтобы выполнить его?
Почему мы должны указать, что файл находится в текущем каталоге, чтобы выполнить его?
Поведение оболочки стандартизировано 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» при запуске сценариев оболочки?
Из 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, вы можете вызвать исполняемый файл без начального значения .
Это будет зависеть от того, кем вы являетесь $ PWD.
./ a .out
говорит системе искать a.out в текущем каталоге, так как вы указали путь к файлу a.out
a.out
будет работать, только если $ PWD (ваш текущий рабочий каталог) находится в $ PATH или в каталогах, в которых выполняется поиск двоичных файлов.
Ваш текущий каталог ищется только в том случае, если он указан в полях поиска, что уменьшает количество ошибок и потенциально повышает безопасность, избегая ошибок.