Існує аналогічне запитання, яке стосується сценарію "обгортання", де ви хочете замінити, наприклад, cdкоманду, яка викликає вбудований cd.
Однак, зважаючи на оболонку та інші та знаючи, що баш імпортує функції з навколишнього середовища, я зробив кілька тестів, і я не можу знайти спосіб безпечно викликати вбудований cdз мого сценарію.
Розглянемо це
cd() { echo "muahaha"; }
export -f cd
Будь-які сценарії, викликані в цьому середовищі, що використовують, cdбудуть порушені (врахуйте ефекти чогось подібного cd dir && rm -rf .).
Існують команди для перевірки типу команди (зручно називатися type) та команди для виконання вбудованої версії, а не функції ( builtinта command). Але ось ось вони можуть бути відмінені і за допомогою функцій
builtin() { "$@"; }
command() { "$@"; }
type() { echo "$1 is a shell builtin"; }
Вийде наступне:
$ type cd
cd is a shell builtin
$ cd x
muahaha
$ builtin cd x
muahaha
$ command cd x
muahaha
Чи є спосіб безпечно змусити bash використовувати вбудовану команду чи принаймні виявити, що команда не є вбудованою, не очищаючи все середовище?
Я розумію, якщо хтось контролює ваше оточення, ви, ймовірно, все одно накрутили, але принаймні для псевдонімів ви маєте можливість не називати псевдонім, вставляючи його \перед цим.
envвін також не визначений як функція. Це жахливо. Я спершу подумав, що допоможуть спеціальні символи - дзвінки з повним шляхом, що включає /використання .джерела тощо. Але їх також можна використовувати для імен функцій! Ви можете перезначити будь-яку функцію, яку хочете, але важко повернутися до виклику вихідної команди.
#/bin/shякщо це не інтерактивна оболонка за замовчуванням.
envкоманду перш, як це:env -i <SCRIPT.sh>