Ist es möglich, einen Befehlsblock als anonyme Funktion zu behandeln?
function wrap_this {
run_something
# Decide to run block or maybe not.
run_something else
}
wrap_this {
do_something
do_somthing else
}
# Do something else
wrap_this {
do_something_else_else
do_something_else_else_else
}
(Mir ist klar, dass Sie für jeden Block eine Funktion oder Datei erstellen, aber ich finde diese Option in bestimmten Situationen klarer und leichter zu lesen.)
while
macht es mit do/done
und function
macht es mit { multiple lines }
. Mir ist klar, dass BASH keine anonymen Funktionen hat, aber ist es möglich, mehrere Befehle an eine andere Funktion zu übergeben, wie Sie dies beim Definieren einer Funktion tun können oder while
?
Antworten:
Dies ist die kürzeste Lösung, die ich mir vorstellen kann:
Angesichts dieser Funktionen:
Beispiele:
(Diese Beispiele sind natürlich nur Verwendungsbeispiele, und in Wirklichkeit wäre dieser Stil nur für kompliziertere Anwendungsfälle sinnvoll.)
Im Allgemeinen kann immer der folgende Stil verwendet werden:
Es ist nicht ganz Lambda, aber es ist sehr, sehr nah. Nur ein paar überschüssige Zeichen.
Aber eine der folgenden Abkürzungen funktioniert nicht, soweit ich das beurteilen kann:
Leider
bash
ist es nicht sehr gut für diesen Stil geeignet, obwohl einige seiner Funktionen einen sehr funktionalen Stil haben.quelle
Sie können Code in einem String setzen und übergeben es an
eval
odersh
oder es einfach zu interpolieren.Es kann jedoch schnell zu Problemen beim Zitieren kommen.
quelle
perform { echo "moo" \n echo "moo moo" \n echo "moo moo moo" }
. Ich wusste bereits, dass Sie einen Befehl übergeben können. Aber ich suche nach mehreren Zeilen, nicht nur nach einem Befehl oder einer Zeile. Danke, dass du es versucht hast.Nein, bash hat keine anonymen Funktionen. Es ist jedoch möglich, einen Funktionsnamen und Argumente als Zeichenfolgen zu übergeben und von bash aufrufen zu lassen.
Dies ist jedoch etwas begrenzt. Der Umgang mit Zitaten kann zum Problem werden. Das Übergeben von mehr als einem Befehl ist ebenfalls eine Komplikation.
quelle
$*
zu"$@"
Ich habe es geschafft, mit einem
eval
Hack zu machen, was du willst . Damit warnte ich, dass die Bewertung unsicher ist und Sie um jeden Preis vermeiden sollten . Wenn Sie jedoch darauf vertrauen, dass Ihr Code nicht missbraucht wird, können Sie Folgendes verwenden:Auf diese Weise können Sie Code wie folgt ausführen:
Nicht gerade ideal, da der innere Block eine Zeichenfolge ist, aber eine Wiederverwendung erzeugt.
quelle
!!
eine Substitution im Heredoc zu verhindern. stackoverflow.com/questions/27920806/…