2011-08-19 6 views
7

Sto lavorando a un'applicazione C che deve percorrere $ PATH per trovare percorsi completi per i binari, e l'unica dipendenza consentita è glibc (cioè non chiamare programmi esterni come i quali). Nel caso normale, ciò comporta semplicemente la suddivisione di getenv ("PATH") per due punti e il controllo di ogni directory uno per uno, ma voglio essere sicuro di coprire tutti i possibili casi d'angolo. Che cosa ho bisogno di capire? In particolare, i percorsi relativi, i percorsi che iniziano con ~ sono destinati ad essere espansi in $ HOME o i percorsi che contengono: char consentito?

risposta

11

Una cosa che una volta mi ha sorpreso è che la stringa vuota in PATH indica la directory corrente. Due punti o due punti adiacenti alla fine o all'inizio di PATH indicano che la directory corrente è inclusa. Questo è documentato in man bash per esempio.

È anche nel POSIX specification.

Così

PATH=:/bin 
PATH=/bin: 
PATH=/bin::/usr/bin 

tutta la media la directory corrente è in PATH

+3

+1 Dopo aver controllato il codice sorgente per 'which', sembra che questo sia l'unico caso d'angolo. 'which' controlla prima se è stato fornito un percorso completo e il file è eseguibile. Quindi antepone ciascun componente del percorso e controlla nuovamente, sostituendo un componente di percorso vuoto con la directory corrente. –

+0

Seguendo la specifica, l'implementazione di 'which' e alcune shell standard comuni dovrebbe fornire una buona prospettiva. – Novelocrat

2

io non sono sicuro che questo è un problema con Linux in generale, ma assicurarsi che il codice funziona se PATH ha qualche funky (come, UTF-8) codifica per trattare con le directory con lettere di fantasia. Sospetto che ciò potrebbe dipendere dalla codifica del filesystem.

Mi ricordo di aver lavorato a un bug report di un ragazzo russo che aveva lettere fantasiose nel suo nome utente (e quindi, il suo nome di directory home che appariva in PATH).

+0

No, la codifica è irrilevante per 'PATH'. Se un programma lo considera, è buggato. –

+0

@R .: interessante; avete alcune specifiche per supportare tale affermazione? La mia comprensione è che per analizzare 'PATH', è necessario trattarlo come una sequenza di caratteri (invece di una sequenza di 'bytes'), quindi è necessario essere consapevoli della codifica. –

+1

L'unico carattere speciale in 'PATH' è': ', quindi l'unica volta che il tuo reclamo potrebbe avere validità è con le codifiche CJK legacy per Windows, ma queste sono generalmente considerate inutilizzabili su Unix. –

1

Questo è minore ma lo aggiungerò poiché non è già stato menzionato. $ PATH può includere sia percorsi assoluti che relativi. Se esegui la scansione dell'elenco dei percorsi tramite chdir (2) in ogni directory, devi tenere traccia della directory di lavoro originale (getcwd (3)) e chdir (2) di nuovo ad ogni iterazione della scansione.

1

Le risposte esistenti coprono la maggior parte di esso, ma vale la pena che copre parti della questione che non è stata ancora risposta:

  1. $ e ~ non sono speciali nel valore di $ PATH.
  2. Se $ PATH non è impostato, execvp() utilizzerà un valore predefinito.