Jest to podobne pytanie , które zajmuje się „owijania” scenariusza, w którym chcesz zastąpić na przykład cdz poleceniem, która wywołuje polecenie wbudowane cd.
Jednak w świetle shellshocka i innych oraz wiedząc, że bash importuje funkcje ze środowiska, przeprowadziłem kilka testów i nie mogę znaleźć sposobu, aby bezpiecznie wywołać wbudowaną wersję cdz mojego skryptu.
Rozważ to
cd() { echo "muahaha"; }
export -f cd
Wszelkie skrypty wywoływane w tym środowisku za pomocą cdulegną awarii (weź pod uwagę skutki czegoś takiego cd dir && rm -rf .).
Istnieją polecenia sprawdzające typ polecenia (wygodnie wywoływanego type) oraz polecenia do wykonania wbudowanej wersji, a nie funkcji ( builtini command). Ale oto oto można je również zastąpić za pomocą funkcji
builtin() { "$@"; }
command() { "$@"; }
type() { echo "$1 is a shell builtin"; }
Przyniesie następujące:
$ type cd
cd is a shell builtin
$ cd x
muahaha
$ builtin cd x
muahaha
$ command cd x
muahaha
Czy jest jakiś sposób, aby bezpiecznie zmusić bash do użycia wbudowanego polecenia, lub przynajmniej wykryć, że polecenie nie jest wbudowane, bez czyszczenia całego środowiska?
Zdaję sobie sprawę, że jeśli ktoś kontroluje twoje środowisko, prawdopodobnie i tak masz problemy, ale przynajmniej w przypadku aliasów masz opcję, aby nie wywoływać aliasu poprzez wstawienie \przed nim.
envnie jest również zdefiniowane jako funkcja. To jest przerażające. Najpierw pomyślałem, że pomogą znaki specjalne - dzwonienie z pełną ścieżką, która obejmuje /, używanie .źródła i tak dalej. Ale można ich również używać do nazw funkcji! Państwo może na nowo zdefiniować dowolną funkcję, którą chcesz, ale trudno wrócić do wywoływania oryginalnego polecenia.
#/bin/shjeśli nie jest to domyślna powłoka interaktywna.
envpolecenia, w ten sposób:env -i <SCRIPT.sh>