cd
oltre ad essere un built-in di shell, in realtà è anche un programma su sistemi operativi POSIX compatibili. Essi devono fornire eseguibili indipendenti per le utilities regolari, come cd
. Questo è per esempio il caso di Solaris , AIX , HP-UX e OS X .
Ovviamente, un built-in cd
è ancora obbligatorio poiché la sua implementazione esterna non cambia la directory della shell corrente. Tuttavia, quest'ultimo può ancora essere utile. Ecco un esempio che mostra come POSIX prevede come utilizzare questo cd
comando:
find . -type d -exec cd {} \;
Su un sistema POSIX, questo oneliner segnalerà un messaggio di errore per tutte le directory in cui non sei autorizzato a entrare cd
. Nella maggior parte delle distribuzioni Gnu / Linux, non riesce con quel messaggio di errore:
find: `cd': No such file or directory
Ed ecco la risposta alla tua domanda " Perché cd non è un programma? " Di uno dei co-autori originali di Unix. Su una primissima implementazione di Unix, cd
(scritto chdir
in quel momento) c'era un programma esterno. Ha smesso di funzionare inaspettatamente dopo essere fork
stato implementato per la prima volta.
Citando Dennis Ritchie :
Nel mezzo del nostro giubilo, è stato scoperto che il comando chdir (cambia directory corrente) aveva smesso di funzionare. C'era molta lettura di codice e ansiosa introspezione su come l'aggiunta di fork avrebbe potuto interrompere la chiamata chdir. Alla fine spuntò la verità: nel vecchio sistema chdir era un comando ordinario; ha regolato la directory corrente del processo (unico) collegato al terminale. Con il nuovo sistema, il comando chdir ha modificato correttamente la directory corrente del processo creato per eseguirlo, ma questo processo è stato prontamente terminato e non ha avuto alcun effetto sulla sua shell madre! Era necessario rendere chdir un comando speciale, eseguito internamente all'interno della shell. Si scopre che diverse funzioni simili a comandi hanno la stessa proprietà, ad esempio il login.
Fonte: Dennis M. Ritchie, " L'evoluzione del sistema di condivisione del tempo Unix ", AT&T Bell Laboratories Technical Journal 63 (6), parte 2, ottobre 1984, pagg. 1577–93
La pagina del manuale di chdir di Unix versione 1 (marzo 1971) afferma:
Poiché viene creato un nuovo processo per eseguire ciascun comando, chdir sarebbe inefficace se fosse scritto come un normale comando. È quindi riconosciuto ed eseguito dalla Shell.