Функция POSIX для поиска пути к исполняемому файлу?
есть ли функция POSIX, которая ищет PATH для исполняемого согласно описание спецификации POSIX PATH переменные среды и возвращает абсолютный путь к исполняемому файлу?
если нет, есть простой, безопасный, стандартный и надежный способ поиска PATH?
Edit:
в glibc execvpe() функции свои PATH поиск, поэтому я предполагаю, что нет конкретного PATH поиск функция, определенная стандартом.
Edit 2: я не хочу копировать чужой код или использовать тег PATH поиск себя по нескольким причинам:
- сухой
- больше кода я должен проверить и сохранить
- возможные проблемы лицензирования
- POSIX говорит: "Если
PATHНе задано или имеет значение null, поиск пути определяется реализацией."Я хотел бы, чтобы поведение в этих случаях было соответствует тому, что делает система, но я не могу этого сделать, если нет стандартной функции, которую я могу вызвать.
3 ответов
есть ли функция POSIX, которая ищет путь для исполняемого файла в соответствии с описанием спецификации POSIX переменной среды PATH и возвращает абсолютный путь к исполняемому файлу?
нет.
если нет, есть простой, безопасный, стандартный и надежный способ поиска пути?
да и нет. Да, существует стандарт для формата PATH, из которых правильность / надежность реализаций следовать.
нет, нет стандартной функции, которая делает это. Копирование кода-ваш лучший выбор.
если
PATHНе задано или имеет значение null, поиск пути определяется реализацией.
это означает, что вы не можете всегда портативно скопировать execvp делает, но поиск /bin:/usr/bin - Это довольно безопасная ставка. В качестве альтернативы, просто вызовите ошибку в этом случае.
(Я признаю, что было бы неплохо, если бы POSIX имел это функция, но ее просто нет.)
как насчет того, чтобы сделать что-то вроде:
FILE *f = popen("command -v somecommand", "r")
а затем прочитать его вывод? Это приведет к поведению, которое соответствует обработке системы empty / unset PATH, и это может быть проще, чем вручную искать PATH.
в этом подходе есть некоторые недостатки:
- если
somecommandисходит от пользователя, его, возможно, придется дезинфицировать, чтобы предотвратить атаки инъекций кода. Это добавило бы сложности. - надежно чтения поток при обработке всех возможных случаев ошибок не является тривиальным. Больше сложности.
- если
somecommandявляется оболочкой специального встроенного (например,set), он вернет фиктивные результаты. Этот случай должен быть обнаружен, но что тогда? Больше сложности.