2012-06-15 14 views
8

Esiste una funzione POSIX che ricerca PATH per un eseguibile in base allo POSIX spec's description of the PATH environment variable e restituisce il percorso assoluto dell'eseguibile?Funzione POSIX per cercare PATH per un eseguibile?

In caso contrario, esiste un modo semplice, sicuro, standard e affidabile per cercare PATH?

Edit: glibc's execvpe() function fa proprio PATH di ricerca, quindi immagino non v'è una specifica funzione di ricerca PATH definito dallo standard.

Edit 2: non voglio per copiare il codice di qualcun altro o implementare la PATH me la ricerca di un paio di motivi:

  • DRY
  • Più codice che ho per testare e mantenere
  • Possibili problemi di licenza
  • POSIX dice "Se PATH non è impostato o è impostato su null, la ricerca del percorso è definita dall'implementazione." Mi piacerebbe che il comportamento in questi casi fosse coerente con qualsiasi cosa il sistema facesse, ma non posso farlo se non c'è una funzione standard che posso chiamare.
+1

'execvp' e' execlp' sono funzioni standard POSIX. Stai cercando una funzione * che * * cerchi '$ PATH'? –

+0

@larsmans: yes e restituisce una stringa contenente il percorso completo dell'eseguibile (se trovato) –

risposta

7

C'è una funzione POSIX che cerca PATH per un eseguibile in base alla descrizione del specifiche POSIX della variabile d'ambiente PATH e restituisce il percorso assoluto del file eseguibile?

No.

In caso contrario, c'è un modo semplice, sicuro, di serie, ed affidabile per la ricerca PATH?

Sì e no. Sì, esiste uno standard per il formato di PATH, da cui deriva la correttezza/affidabilità delle implementazioni.

No, non esiste una funzione standard che lo faccia. Copiare il codice è la soluzione migliore.

Se PATH non è impostato o è impostato su null, la ricerca del percorso è definita dall'implementazione.

Ciò significa che non si può sempre portabile replicare quello execvp fa, ma la ricerca /bin:/usr/bin è una scommessa abbastanza sicuro. In alternativa, si solleva un errore in questo caso.

(Ammetto che sarebbe stato bello se POSIX avesse avuto questa funzione, ma semplicemente non c'è.)

3

Lo strumento da riga di comando which lo farà. here's the man page

and the source

+0

Non ritengo che l'adattamento di centinaia di righe del codice di qualcun altro sia semplice. –

+1

Se ci fosse un modo semplice per farlo, sarebbe già stato fatto. Non fa parte delle specifiche di posix. – gcochard

+1

È molto semplice. L'iterazione sugli elementi di '$ PATH' è un paio di righe di C. Se mai, la ragione per cui non è in POSIX è che è * troppo semplice *, cioè banale da fare da solo, quindi non meritava che qualcuno inventasse una nuova interfaccia. –

0

Che dire di fare qualcosa di simile:

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

e poi leggere la sua uscita? Ciò comporterebbe un comportamento che corrisponde alla gestione del vuoto/non impostato PATH e potrebbe essere più semplice della ricerca manuale PATH.

ci sono alcuni svantaggi di questo approccio:

  • Se somecommand proviene da parte dell'utente, potrebbe dover essere sterilizzate per prevenire attacchi di iniezione di codice. Ciò aggiungerebbe alla complessità.
  • La lettura del flusso in modo affidabile mentre si gestiscono tutti i possibili casi di errore non è banale. Più complessità
  • Se somecommand è una shell speciale incorporata (ad esempio, set), restituirà risultati fasulli. Questo caso dovrebbe essere rilevabile, ma allora? Più complessità
Problemi correlati