Lo standard shell POSIX dice su questo sito
http://pubs.opengroup.org/onlinepubs/9699919799/
su come le shell usano PATH
per cercare gli eseguibili:
"L'elenco deve essere cercato dall'inizio alla fine, applicando il nome file a ciascun prefisso, fino a quando non viene trovato un file eseguibile con il nome specificato e le autorizzazioni di esecuzione appropriate."
Bene, non è così che sembra funzionare nell'implementazione POSIX reale:
man which
dice:
"restituisce i percorsi dei file (o collegamenti) che verrebbero eseguiti nell'ambiente attuale, se i suoi argomenti fossero dati come comandi in una shell strettamente conforme a POSIX. Lo fa cercando nel PERCORSO i file eseguibili che corrispondono ai nomi dei argomenti. Non segue collegamenti simbolici ".
OK, diamo un'occhiata a questa situazione:
$ pwd
/home/mark
$ echo $PATH
/home/mark/bin:
...
$ ls -l bin/foobar
lrwxrwxrwx 1 mark mark 18 Dec 12 22:51 bin/foobar -> /home/mark/foobar1
$ touch foobar1
$ which foobar
$ chmod a+x foobar1
$ which foobar
/home/mark/bin/foobar
OK, qui c'è un link simbolico PATH
con il nome corretto e viene segnalato ls
come eseguibile.
which
non lo guarda affatto, ma è interessato solo a ciò a cui punta.
Ciò nonostante il fatto che entrambi man which
affermino esplicitamente che non segue collegamenti simbolici (e in effetti lo vediamo non, perché which foobar
non stampa foobar1
), e anche che la documentazione della shell POSIX citata sopra, non menziona mai i seguenti collegamenti simbolici PATH
nell'algoritmo.
Quindi, which
le shell esistenti sono sbagliate o non capisco la documentazione?
CHIARIRE:
Conosco e posso spiegare il comportamento esistente. La mia domanda non è "come funziona?". Questo lo so.
La mia domanda riguarda la documentazione: dov'è il mio errore nel seguire la documentazione che ho citato. O la documentazione è sbagliata?
MOTIVAZIONE: Perché me ne importa?
Bene, sono un implementatore. Diversi implementatori hanno requisiti diversi. Per me, il requisito è che la parola dell'attuale standard POSIX DEVE essere seguita ESATTAMENTE (o, più precisamente, il meglio che può essere, perché lo standard stesso è in qualche modo difettoso). Come fosse la parola di Dio.
Ora, la formulazione standard è abbastanza chiara: i seguenti collegamenti simbolici non sono menzionati, dove in molti altri luoghi, è menzionato dove deve essere fatto. Quindi, in questo caso, non farlo.
Tuttavia, ricontrollo sempre come dash
e come mi bash
comporto, per essere sicuro. Ora, ovviamente, c'è anche un piccolo problema qui, dash
anche se è fatturato come POSIX, ha molti piccoli bug con conformità a POSIX. bash
, Non ho ancora trovato alcun bug con POSIX, ma ... bash non è in realtà POSIX, è molto di più.
Così il gioco è fatto. Ecco perché mi interessa.
$PATH
, non ha collegamenti simbolici.
lstat(2)
), di seguito non viene generalmente indicato. Ad esempio, la descrizione di open(2)
menziona solo i link simbolici quando si parla del comportamento di O_CREAT | O_EXCL
. Non è necessario indicare che il file di destinazione verrà aperto.
$PATH
can contiene collegamenti simbolici. Provawhich sh
.