Jest to podobne pytanie , które zajmuje się „owijania” scenariusza, w którym chcesz zastąpić na przykład cd
z 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ę cd
z mojego skryptu.
Rozważ to
cd() { echo "muahaha"; }
export -f cd
Wszelkie skrypty wywoływane w tym środowisku za pomocą cd
ulegną 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 ( builtin
i 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.
env
nie 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/sh
jeśli nie jest to domyślna powłoka interaktywna.
env
polecenia, w ten sposób:env -i <SCRIPT.sh>