Czy jest jakiś sposób, aby ponownie zdefiniować funkcję bash pod względem jej starej definicji? Na przykład chciałbym dodać następujący blok kodu do preambuły funkcji command_not_found_handle ()
,
# Check if $1 is instead a bash variable and print value if it is
local VAL=$(eval echo \"\$$1\")
if [ -n "$VAL" ] && [ $# -eq 1 ]; then
echo "$1=$VAL"
return $?
fi
Jest on obecnie zdefiniowany w /etc/profile.d/PackageKit.sh i pochodzi ze skryptów startowych bash.
W ten sposób mogę zapytać o wartość zmiennej środowiskowej w wierszu polecenia, po prostu wpisując nazwę zmiennej (i pod warunkiem, że takie polecenie o tej nazwie nie istnieje). na przykład
user@hostname ~:$ LANG
LANG=en_AU.utf8
Wiem, że mogłem po prostu skopiować i wkleić bieżącą definicję i dodać własne zmiany ~/.bashrc
, ale szukam bardziej eleganckiego sposobu, który wymaga ponownego użycia kodu.
Doceniane są także lepsze sposoby osiągnięcia mojego celu lub ulepszeń / rozszerzeń kodu.
eval
możesz użyć pośredniej:local VAL=$(echo ${!1})
Odpowiedzi:
Możesz wydrukować bieżącą definicję funkcji, a następnie zawrzeć ją w definicji funkcji w
eval
klauzuli.Innym podejściem, które wydaje mi się jaśniejsze, jest zdefiniowanie oryginalnej funkcji pod nową nazwą i wywołanie jej z twojej definicji. Działa to tylko wtedy, gdy nie musisz oddziaływać na lokalne zmienne oryginalnej definicji.
źródło
declare -f
, ale podoba mi się sposób, w jaki zmieniasz nazwę oryginalnego func.Dzięki @mat, @ dennis-williamson. Po przeczytaniu twoich komentarzy to właśnie otrzymałem
Chociaż myślę, że wolę rozwiązanie @Gilles.
źródło