Lo standard shell POSIX dice su questo sito
http://pubs.opengroup.org/onlinepubs/9699919799/
su come le shell usano PATHper 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 PATHcon il nome corretto e viene segnalato lscome eseguibile.
which non lo guarda affatto, ma è interessato solo a ciò a cui punta.
Ciò nonostante il fatto che entrambi man whichaffermino esplicitamente che non segue collegamenti simbolici (e in effetti lo vediamo non, perché which foobarnon stampa foobar1), e anche che la documentazione della shell POSIX citata sopra, non menziona mai i seguenti collegamenti simbolici PATHnell'algoritmo.
Quindi, whichle 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 dashe come mi bashcomporto, per essere sicuro. Ora, ovviamente, c'è anche un piccolo problema qui, dashanche 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.
$PATHcan contiene collegamenti simbolici. Provawhich sh.