Функция 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 имел это функция, но ее просто нет.)


инструмент командной строки which сделаю это. вот man page

и источник


как насчет того, чтобы сделать что-то вроде:

FILE *f = popen("command -v somecommand", "r")

а затем прочитать его вывод? Это приведет к поведению, которое соответствует обработке системы empty / unset PATH, и это может быть проще, чем вручную искать PATH.

в этом подходе есть некоторые недостатки:

  • если somecommand исходит от пользователя, его, возможно, придется дезинфицировать, чтобы предотвратить атаки инъекций кода. Это добавило бы сложности.
  • надежно чтения поток при обработке всех возможных случаев ошибок не является тривиальным. Больше сложности.
  • если somecommand является оболочкой специального встроенного (например,set), он вернет фиктивные результаты. Этот случай должен быть обнаружен, но что тогда? Больше сложности.