È possibile creare qualcosa di analogo a una funzione anonima il cui valore può essere assegnato a un elemento di matrice e successivamente chiamato? Non riesco a trovare un modo per farlo in uno script bash, ma forse c'è una soluzione alternativa.Funzioni anonime negli script di shell
risposta
Risposta breve: No.
Risposta lunga: Nooooooooooooo.
Risposta completa: le funzioni in bash non sono oggetti di prima classe, quindi non è possibile avere funzioni anonime in bash.
La tecnica comune è quello di assegnare le definizioni di funzione condizionale:
#!/bin/sh case $1 in a) foo() { echo case a; };; b) foo() { echo case b; };; *) foo() { echo default; } ;; esac foo
Se avete veramente bisogno array per memorizzare le funzioni, è possibile definire funzioni con nome e memorizzare solo i loro nomi. È quindi possibile chiamare la funzione come ${array[n]}
. Oppure, è possibile denominarli func1
.. funcN
e quindi chiamare semplicemente func$n
.
È possibile; Ho scritto una biblioteca per fare esattamente questo, anche se è un progetto molto strano. Il codice sorgente è disponibile allo http://github.com/spencertipping/bash-lambda. Usando questa libreria:
$ 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
$
Il trucco è quello di avere la funzione fn
creare un file contenente il corpo della funzione, chmod +x
quel file, per poi tornare il suo nome. Ciò causa l'accumulo di file vaganti, motivo per cui la libreria implementa anche un garbage collector asincrono di mark/sweep.
C'è un modo per aspettare che un comando finisca di essere eseguito prima di eseguire la funzione anonima? – William
Creare il file fn nel 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"
È quindi possibile fare:
foo=$(fn 'echo $1')
${foo} "bar"
ben bash è Turing completa, thats soo perfettamente possibile;)
ma a parte questo non ne vale veramente la pena.
si potrebbe simulare tale comportamento anche se con qualcosa seguendo questa linea:
echo myval ; (foocmd "$_" && barcmd "$_")
ma perché?!?
- 1. modo preferito di #! negli script di shell
- 2. Cosa fa l'operatore "= ~" negli script di shell?
- 3. Funzioni anonime Tcl
- 4. Uso di variabili di sola lettura negli script di shell
- 5. Funzioni anonime e non anonime Lua
- 6. Come gestire la latenza NFS negli script di shell
- 7. funzioni anonime considerate dannose?
- 8. VB.NET ha funzioni anonime?
- 9. funzioni anonime finto C
- 10. Funzioni PHP ricorsive anonime
- 11. Utilizzo di funzioni anonime autoinvitrici
- 12. variabili php in funzioni anonime
- 13. Funzioni anonime nidificate in Clojure
- 14. haskell e script di shell Unix
- 15. Assegnazione dinamica di funzioni anonime in pascal
- 16. C# - funzioni anonime e gestori di eventi
- 17. Istruzioni di ritorno Scala in funzioni anonime
- 18. Funzioni anonime senza parametri di input
- 19. Cosa significa "$?" significa negli script di bash?
- 20. Utilizzo di funzioni anonime di chiamata automatica e $ (documento) .ready
- 21. script di shell: if
- 22. Shell array di script
- 23. variabili negli script TOAD
- 24. funzioni anonime si chiamano in MATLAB
- 25. Funzioni differenziali multiple vs anonime differite
- 26. Un modo per controllare le funzioni anonime?
- 27. Passare argomenti in funzioni anonime in JavaScript
- 28. Variabili globali JavaScript e funzioni anonime autoinventi
- 29. Gestione delle conferme di input negli script di shell di Linux
- 30. Punti e virgola superflui alla fine di una riga negli script di shell?
Per risolvere il problema, definirei le funzioni con i nomi e memorizzerò solo i nomi nell'array; quindi basta "evalare" l'elemento dell'array quando si desidera chiamare la funzione. – choroba
@choroba Forse dovresti postare questo come risposta. Anche se non è direttamente possibile come descritto da Ignacio, la tua soluzione è una buona idea. – Matty
Il bug di bash in CVE-2014-6271 [collegamento] (https://www.reddit.com/r/netsec/comments/2hbxtc/cve20146271_remote_code_execution_through_bash/ckrhvtl) conferma che le funzioni anonime possono esistere negli script di shell? – Lizz