Команди, вбудовані в оболонку, часто вбудовуються через збільшення продуктивності, яке це дає. Наприклад, виклик зовнішньої програми 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
теоретично це може бути (але це не дуже зробить).