Ogni shell Unix ha almeno alcuni comandi incorporati. Questi comandi incorporati fanno parte della shell e sono implementati come parte del codice sorgente della shell. La shell riconosce che il comando che è stato chiesto di eseguire era uno dei suoi builtin, e esegue quell'azione da solo, senza richiamare un eseguibile separato. Diverse shell hanno diversi builtin, anche se ci sarà un sacco di sovrapposizioni nel set di base.
A volte, i builtin sono incorporati per motivi di prestazioni. In questo caso, c'è spesso anche una versione di quel comando in $PATH
(possibilmente con un set di funzionalità diverse, un diverso insieme di argomenti della riga di comando riconosciuti, ecc.), Ma la shell ha deciso di implementare il comando come un builtin in modo che potesse salva il lavoro di generare un processo di breve durata per fare del lavoro che potrebbe fare da solo. Questo è il caso per bash e printf, ad esempio:
$ type printf
printf is a shell builtin
$ which printf
/usr/bin/printf
$ printf
printf: usage: printf [-v var] format [arguments]
$ /usr/bin/printf
/usr/bin/printf: missing operand
Try `/usr/bin/printf --help' for more information.
noti che nell'esempio precedente, printf è sia una shell builtin (implementato come parte di bash stesso), così come un comando esterno (situato in/usr/bin/printf). Notare che si comportano in modo diverso anche - quando vengono chiamati senza argomenti, la versione integrata e la versione di comando stampano diversi messaggi di errore. Nota anche l'opzione -v var
(memorizza i risultati di questo printf in una variabile di shell denominata var
) può essere eseguita solo come parte della shell - i sottoprocessi come/usr/bin/printf non hanno accesso alle variabili della shell che li ha eseguiti.
E questo ci porta alla seconda parte della storia: alcuni comandi sono incorporati perché devono essere. Alcuni comandi, come chmod
, sono involucri sottili attorno alle chiamate di sistema. Quando si esegue /bin/chmod 777 foo
, i fork shell, execs/bin/chmod (passando "777" e "foo") come argomenti, e il nuovo processo chmod esegue il codice C chmod("foo", 777);
e quindi restituisce il controllo alla shell. Ciò non funzionerebbe per il comando cd
, tuttavia. Anche se cd
sembra lo stesso caso di chmod
, deve comportarsi in modo diverso: se la shell ha generato un altro processo per eseguire la chiamata di sistema chdir
, cambierebbe la directory solo per quel processo appena generato, non per la shell. Quindi, quando il processo è tornato, la shell sarebbe rimasta nella stessa directory di sempre, quindi cd
deve essere implementato come shell incorporato.
Questo non ha nulla a che fare con il kernel. –