2012-06-15 9 views
8

¿Hay una función POSIX que busque PATH para un ejecutable según el POSIX spec's description of the PATH environment variable y devuelve la ruta absoluta al ejecutable?Función POSIX para buscar RUTA para un ejecutable?

Si no es así, ¿existe una forma sencilla, segura, estándar y confiable de buscar PATH?

Editar: glibc's execvpe() function hace su propia PATH búsqueda, así que supongo que no es una función de búsqueda PATH específico definido por la norma.

Edición 2: no quiero copiar el código de otra persona o implementar la PATH mismo buscar un par de razones:

  • DRY
  • Más código que tengo para probar y mantener
  • Posibles problemas de licencia
  • POSIX dice: "Si PATH está desactivado o está configurado como nulo, la búsqueda de ruta está definida por la implementación." Me gustaría que el comportamiento en estos casos sea coherente con lo que haga el sistema, pero no puedo hacerlo si no hay una función estándar a la que pueda llamar.
+1

'execvp' y' execlp' son funciones estándar POSIX. ¿Estás buscando una función que * solo * busque '$ PATH'? –

+0

@larsmans: sí, y devuelve una cadena que contiene la ruta completa al ejecutable (si se encuentra) –

Respuesta

7

¿Hay una función POSIX que busca en el PATH para un ejecutable según la descripción de la especificación POSIX de la variable de entorno PATH y devuelve la ruta absoluta al ejecutable?

Si no es así, hay una manera simple, segura, estándar y fiable a la ruta de búsqueda?

Sí y no. Sí, hay un estándar para el formato PATH, del cual se sigue la corrección/confiabilidad de las implementaciones.

No, no hay una función estándar que lo haga. Copiar código es su mejor apuesta.

Si PATH está desactivado o está establecido en nulo, la búsqueda de ruta está definida por la implementación.

Eso significa que puede no siempre portable replicar lo que hace execvp, pero buscando /bin:/usr/bin es una apuesta bastante segura. Alternativamente, solo genera un error en este caso.

(admito que habría sido bueno si POSIX hubiera tenido esta función, pero simplemente no está allí.)

3

La herramienta de línea de comandos which hará eso. here's the man page

and the source

+0

No considero que la adaptación de cientos de líneas del código de otra persona sea simple. –

+1

Si hubiera una manera simple de hacerlo, ya se habría hecho. No es parte de la especificación de posix. – gcochard

+1

Es muy simple. Iterar los elementos de '$ PATH' es un par de líneas de C. En todo caso, la razón por la que no está en POSIX es que es * demasiado simple *, es decir, que es trivial hacerlo tú mismo, así que no merecía que alguien inventara una nueva interfaz. –

0

¿Qué hay de hacer algo como:

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

y luego leer su salida? Esto daría como resultado un comportamiento que coincide con el manejo del sistema de PATH vacío/no enrutado, y puede ser más simple que buscar manualmente PATH.

hay algunos inconvenientes de este enfoque:

  • Si somecommand proviene del usuario, que puede tener que ser desinfectados para evitar ataques de inyección de código. Eso se agregaría a la complejidad.
  • La lectura confiable de la secuencia al manejar todos los posibles casos de error no es trivial. Más complejidad
  • Si somecommand es una carcasa incorporada (por ejemplo, set), devolverá resultados falsos. Este caso debe ser detectable, pero ¿qué? Más complejidad
Cuestiones relacionadas