Shellshock błąd w bash działa na zasadzie zmiennych środowiskowych. Szczerze mówiąc, byłem zaskoczony faktem, że istnieje taka funkcja, jak:
„przekazywanie definicji funkcji przez zmienne env”
Dlatego pytanie, choć może nie do końca sformułowane, ma na celu podanie przykładu lub przypadku, w którym konieczne byłoby posiadanie tej funkcji?
Premia. Czy inne powłoki Zsh, Dash itp. Również mają tę funkcję?
bash
environment-variables
function
shellshock
ludzkośćANDpeace
źródło
źródło
parallel
rozpowszechnia definicje funkcji, jeśli wywołuje wiele instancji bash. Jeśli nie w ten sposób, będzie musiał zapisać je w pliku, w którym czytane jest każde wywoływane wystąpienie, a następnie trzeba poradzić sobie z problemami, na przykład kiedy można usunąć ten plik..dot
pobrać ten sam plik, co stara powłoka. tak to się robi - i to ma sens - lub podajesz nową powłokę do pliku jako dane wejściowe podczasexec
ing. po jego wczytaniu, gdy i tak plik jest buforowany przez jądro.Odpowiedzi:
Kiedy skrypt wywołuje inny skrypt, zmienne skryptu nadrzędnego można wyeksportować, a następnie będą widoczne w skrypcie potomnym. Eksportowanie funkcji jest oczywistym uogólnieniem: wyeksportuj funkcję od rodzica, uczyń ją widoczną w dziecku.
Środowisko to jedyny wygodny sposób, w jaki proces może przekazywać dowolne dane swoim dzieciom. Dane muszą zostać połączone w ciągi znaków, które nie zawierają pustych bajtów, co nie jest trudnością dla funkcji powłoki. Istnieją inne potencjalne metody, takie jak bloki pamięci współużytkowanej lub pliki tymczasowe przekazywane przez deskryptory plików, ale mogą powodować problemy z programami pośrednimi, które nie wiedzą, co z nimi zrobić lub je zamkną. Programy oczekują działania w środowisku zawierającym zmienne, których nie znają lub o które nie dbają, więc nie zostaną zastąpione ani usunięte.
Wybór użycia nazwy funkcji jako nazwy zmiennej środowiskowej jest dziwny. Po pierwsze, oznacza to, że eksportowana zmienna koliduje z eksportowaną funkcją o tej samej nazwie.
Eksportowane funkcje to stara funkcja. Funkcje zostały dodane w powłoce Bourne'a w SVR2 , a funkcje eksportowane w powłoce wersji 8 wydanej w tym samym roku (1984). W tej powłoce zmienne i funkcje używały tej samej przestrzeni nazw. Nie wiem, jak działał eksport funkcji. Scheda powłoka jest oparta na wariantu Bourne, który ma funkcje, ale ich nie eksportować.
ATT ksh podobno obsługuje funkcje eksportowania, ale patrząc na źródło lub grając z nim, nie widzę, że działa, jak na ksh93u.
Klony domeny publicznej Ksh (pdksh, mksh), myślnik i zsh nie obsługują funkcji eksportowania.
źródło
BASH_FUNC_f%%=() { echo hi }
. Dlaczego bash parsuje inne zmienne środowiskowe? Dlaczego miałby nawet analizować,BASH_FUNC_g%%
gdy dzwonię tylkof
? (Najwyraźniej przed wstrząsem zmienna środowiskowa została właśnie wywołanaf
lubg
- ale wciąż zastanawiam się, dlaczegog
zostałby przeanalizowany, jeśli nigdy nie wywołałbymg
swojego skryptu)f
, (1) sprawdź, czy funkcja powłoki jest wywoływanaf
, (2) sprawdź zmienną środowiskową o nazwief
i spróbuj ją przeanalizować, (3) sprawdź każdyPATH
komponent dla pliku wykonywalnego o nazwief
. Jak parsowanie każdej zmiennej środowiskowej jako kodu powłoki podczas uruchamiania powłoki może wydawać się mniej skomplikowanym projektem?unset -f foo
, bash nie musi już szukać definicji funkcjifoo
w środowisku), podczas wyświetlania funkcji (jak radzisz sobie zdeclare -f
innymi niż odczytywanie wszystkich zmiennych środowiskowych?) i cokolwiek innego, o czym nie myślę. Twój projekt wydaje się łatwiejszy, ponieważ większość z niego pominąłeś. W przeciwieństwie do tego, robienie wszystkiego przy starcie to pojedynczy fragment kodu, a potem wszystko po prostu działa.