Команди, вбудовані в оболонку, часто вбудовуються через збільшення продуктивності, яке це дає. Наприклад, виклик зовнішньої програми printf відбувається повільніше, ніж використання вбудованого printf.
Оскільки деякі утиліти не потрібно вбудовувати, якщо вони не є спеціальними cd, вони також надаються як зовнішні утиліти. Це так, що сценарії не зламаються, якщо вони інтерпретуються оболонкою, яка не забезпечує вбудований еквівалент.
Деякі вбудовані оболонки також надають розширення до зовнішньої еквівалентної команди. printfНаприклад, Баш вміє це робити
$ printf -v message 'Hello %s' "world"
$ echo "$message"
Hello world
(друк до змінної), яку зовнішня /usr/bin/printfпросто не змогла б зробити, оскільки вона не має доступу до змінних оболонок у поточному сеансі оболонки (і не може їх змінити).
Вбудовані утиліти також не мають обмеження, що їх розширений командний рядок повинен бути коротшим певної довжини. Робимо
printf '%s\n' *
Тому безпечно, якщо printfвбудована команда оболонки. Обмеження на довжину командного рядка походить від execve()функції бібліотеки С, яка використовується для виконання зовнішньої команди. Якщо командний рядок і поточне середовище більше, ніж ARG_MAXбайти (див. getconf ARG_MAXВ оболонці), виклик до execve()не вдасться. Якщо утиліта вбудована в оболонку, execve()викликати її не доведеться.
Вбудовані комунальні послуги мають перевагу над утилітами, знайденими в $PATH. Щоб відключити вбудовану команду bash, використовуйте напр
enable -n printf
Існує короткий список утиліт, які потрібно вбудувати в оболонку (взяті зі списку спеціальних вбудованих стандартів POSIX )
break
colon (:)
continue
dot (.)
eval
exec
exit
export
readonly
return
set
shift
times
trap
unset
Вони повинні бути вбудовані, оскільки вони безпосередньо маніпулюють середовищем та потоком програми поточного сеансу оболонки. Зовнішня утиліта не змогла б цього зробити.
Цікаво, що cdце не є частиною цього списку, але POSIX про це говорить наступне :
Оскільки cdвпливає на поточне середовище виконання оболонки, вона завжди надається як регулярна вбудована оболонка. Якщо він викликається в допоміжному або окремому середовищі виконання утиліти, наприклад, одному з наступних:
(cd /tmp)
nohup cd
find . -exec cd {} \;
це не впливає на робочий каталог оточення абонента.
Тому я припускаю, що "спеціальні" вбудовані модулі не можуть мати зовнішніх аналогів, тоді як cdтеоретично це може бути (але це не дуже зробить).