I comandi integrati nella shell sono spesso integrati a causa dell'aumento delle prestazioni che questo dà. Chiamare l' esterno printf
, ad esempio, è più lento dell'uso incorporato printf
.
Poiché alcune utility non devono essere integrate, a meno che non siano speciali, come cd
, sono anche fornite come utility esterne . Questo in modo che gli script non si rompano se vengono interpretati da una shell che non fornisce un equivalente incorporato.
Alcuni built-in della shell forniscono anche estensioni al comando equivalente esterno. Bash's printf
, per esempio, è in grado di fare
$ printf -v message 'Hello %s' "world"
$ echo "$message"
Hello world
(stampa su una variabile) che l'esterno /usr/bin/printf
semplicemente non sarebbe in grado di fare poiché non ha accesso alle variabili della shell nella sessione di shell corrente (e non può cambiarle).
Le utility integrate non hanno inoltre la limitazione che la loro riga di comando estesa deve essere più corta di una certa lunghezza. fare
printf '%s\n' *
è quindi sicuro se printf
è un comando integrato della shell. La restrizione sulla lunghezza della riga di comando deriva dalla execve()
funzione di libreria C utilizzata per eseguire un comando esterno. Se la riga di comando e l'ambiente corrente sono più grandi dei ARG_MAX
byte (vedere getconf ARG_MAX
nella shell), la chiamata a execve()
fallirà. Se l'utilità è integrata nella shell, execve()
non è necessario chiamarla.
Le utility integrate hanno la precedenza sulle utility trovate in $PATH
. Per disabilitare un comando integrato bash
, utilizzare ad es
enable -n printf
C'è un breve elenco di utility che devono essere integrate in una shell (presa dall'elenco di incorporamenti speciali dello standard POSIX )
break
colon (:)
continue
dot (.)
eval
exec
exit
export
readonly
return
set
shift
times
trap
unset
Questi devono essere integrati poiché manipolano direttamente l'ambiente e il flusso del programma della sessione di shell corrente. Un'utilità esterna non sarebbe in grado di farlo.
È interessante notare che cd
non fa parte di questo elenco, ma POSIX afferma quanto segue :
Poiché cd
influisce sull'attuale ambiente di esecuzione della shell, viene sempre fornito come un normale built-in della shell. Se viene chiamato in una subshell o in un ambiente di esecuzione dell'utilità separato, come uno dei seguenti:
(cd /tmp)
nohup cd
find . -exec cd {} \;
non influisce sulla directory di lavoro dell'ambiente del chiamante.
Suppongo quindi che gli incorporamenti "speciali" non possano avere controparti esterne, mentre cd
in teoria potrebbe esserlo (ma non farebbe molto).