Это дополнительный вопрос к eval cat внутри функции .
Я использую eval
для имитации функциональности import
из других языков (например,как JavaScript).Это то, что я хотел сделать на своей локальной машине некоторое время, так как я собрал огромную коллекцию файлов сценариев.
Причина в том, что теперь у меня очень большое количество отдельных функций в отдельных файлахи я не хочу постоянно читать файлы с помощью source
снова и снова каждый раз, когда я хочу вызвать функциональность.
Это в основном просто для удовольствия, но я не хочу отмахиватьсяя должен когда-либо использовать это в менее случайном контексте:
import_as() {
import_name="$1"
import_fnname="${2:-"$import_name"}"
if test -f "$1"; then
echo "File '$1' doesn't exist."
fi
case "$2" in
*[!-a-zA-Z0-9_]* ) echo "BAD";;
*) eval "$2"'() { '"$(< $1.sh)"'; }' ;;
esac
}
Вот пример его использования:
add.sh
#!/bin/sh
echo "$(($1 + $2))"
sub.sh
#!/bin/sh
echo "$(($1 - $2))"
example_import.sh
import_as "add" "math_add"
import_as "sub"
math_add 2 5 # Returns "7"
math_subtract 5 1 # Returns "4"
Мой вопрос: уязвим ли этот вариант использования eval
для эксплойтов после выполненных мною проверок или в этом скрипте есть что-то пригодное для использования?
PS: IЯ понимаю, что eval
считается злом, и я не хочу слышать это как ответ.Я хочу конкретное обоснование для этого варианта использования, если вы считаете, что в этом случае eval
могут быть эксплойты.