Існує аналогічне запитання, яке стосується сценарію "обгортання", де ви хочете замінити, наприклад, 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>