Функция 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
), он вернет фиктивные результаты. Этот случай должен быть обнаружен, но что тогда? Больше сложности.