Czy można utworzyć coś analogicznego do anonimowej funkcji, której wartość można przypisać do elementu tablicy, a następnie wywołać? Nie mogę znaleźć sposobu, aby to zrobić w skrypcie basha, ale być może istnieje obejście.Funkcje anonimowe w skryptach powłoki
Odpowiedz
Krótka odpowiedź: Nie
Długa odpowiedź: Nooooooooooooo.
Pełna odpowiedź: Funkcje w bash nie są obiektami pierwszej klasy, dlatego nie może być czegoś takiego jak anonimowa funkcja w bashu.
Wspólne technika jest przypisanie definicji funkcji warunkowo:
#!/bin/sh case $1 in a) foo() { echo case a; };; b) foo() { echo case b; };; *) foo() { echo default; } ;; esac foo
Jeśli naprawdę potrzebujesz tablicę do przechowywania funkcji można zdefiniować nazwane funkcje i przechowywać tylko ich nazwy. Następnie możesz wywołać funkcję jako ${array[n]}
. Lub możesz nazwać je func1
.. funcN
, a następnie po prostu zadzwoń func$n
.
Jest to możliwe; Napisałem bibliotekę, aby to dokładnie zrobić, chociaż jest to bardzo dziwny projekt. Kod źródłowy jest dostępny pod adresem http://github.com/spencertipping/bash-lambda. Korzystanie z tej biblioteki:
$ my_array=()
$ my_array[0]=$(fn x 'echo $((x + 1))')
$ my_array[1]=$(fn x 'echo $((x + 2))')
$ ${my_array[0]} 5
6
$ ${my_array[1]} 5
7
$
Sztuką jest mieć funkcja fn
utworzyć plik zawierający ciało funkcji, chmod +x
że plik, a następnie powrócić na swoją nazwę. Powoduje to gromadzenie się zbędnych plików, dlatego też biblioteka implementuje także asynchroniczny zbieracz znaczników/przemiatników.
Czy istnieje sposób oczekiwania na wykonanie polecenia kończącego wykonywanie przed wykonaniem anonimowej funkcji? – William
Utwórz plik fn w PATH
#!/bin/sh
printusage() {
printf "Create anonymous function, for example\n"
printf "fn 'echo "$1 $2"'"
exit 1
}
[ "$#" = "1" ] || printusage
fun=$1
[ "$fun" = "" ] && printusage
fun_file="$(mktemp /tmp/fun_XXXXXX)"
echo "#!/bin/sh" > "$fun_file"
echo "" >> "$fun_file"
echo "$fun" >> "$fun_file"
chmod u+x "$fun_file"
echo "$fun_file"
Można wtedy zrobić:
foo=$(fn 'echo $1')
${foo} "bar"
dobrze bash jest Turinga kompletne, soo ów całkiem możliwe;)
Ale oprócz tego nie jest to warte rozważenia.
można symulować takie zachowanie chociaż coś wzdłuż tej linii:
echo myval ; (foocmd "$_" && barcmd "$_")
ale dlaczego?!?
- 1. Powróć anonimowe funkcje
- 2. Czy są dozwolone funkcje anonimowe?
- 3. Jak pisać rekurencyjne anonimowe funkcje?
- 4. Co to jest usage() w skryptach powłoki?
- 5. Testowanie obsługi kolorów w skryptach powłoki Linux
- 6. Dlaczego warto używać $ {@ + "$ @"} w skryptach powłoki?
- 7. Czy nazwane funkcje lub anonimowe funkcje są preferowane w JavaScript?
- 8. Anonimowe funkcje używające wyrażeń oświadczenia GCC
- 9. Korzystanie anonimowe funkcje z summarize_each lub mutate_each
- 10. Jak wykonać anonimowe funkcje z lokalnymi parametrami?
- 11. Skuteczny sposób na uzyskanie adresu IP w skryptach powłoki
- 12. Jak rozdzielać zmienne od liter w skryptach powłoki
- 13. Jakie jest użycie/znaczenie "#!/Bin/sh" w skryptach powłoki?
- 14. Dlaczego używane są anonimowe funkcje używane w strukturze kodu JavaScript?
- 15. Czy silnik PHP optymalizuje anonimowe funkcje w pętlach?
- 16. Jak dokumentować anonimowe funkcje (zamykanie) za pomocą jsdoc-toolkit
- 17. Zmienne anonimowe w Erlang
- 18. Jak zdefiniować globalne funkcje powłoki w pliku Makefile?
- 19. Argument przechodząc w skryptach SH
- 20. Komentarze w skryptach widoku MySql
- 21. Przepisywanie funkcji w skryptach java
- 22. Anonimowe klasy w PHP 7
- 23. Jak anonimowe klasy w TypeScript
- 24. Niedopasowane anonimowe moduł define()
- 25. Anonimowe plasterki Hash - składnia?
- 26. Javascript Zamknięcie anonimowe
- 27. Java: anonimowe wyliczenia?
- 28. Typy WCF i anonimowe
- 29. Jak rozłączyć anonimowe wydarzenie?
- 30. Samouściowe moduły anonimowe JavaScript
Jako obejście zdefiniowałem funkcje z nazwami i zapisałem tylko nazwy w tablicy; następnie po prostu 'eval' element tablicy, gdy chcesz wywołać funkcję. – choroba
@choroba Być może powinieneś opublikować to jako odpowiedź. Chociaż nie jest to możliwe bezpośrednio, jak opisał Ignacio, twoje obejście jest dobrym pomysłem. – Matty
Czy błąd bash w CVE-2014-6271 [link] (https://www.reddit.com/r/netsec/comments/2hbxtc/cve20146271_remote_code_execution_through_bash/ckrhvtl) potwierdza, że anonimowe funkcje mogą istnieć w skryptach powłoki? – Lizz