É possível tratar um bloco de comandos como uma função anônima?
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
}
(Percebo que você cria uma função ou arquivo para cada bloco, mas acho essa opção mais clara e fácil de ler em determinadas situações.)
while
faz com do/done
e function
faz com { multiple lines }
. Sei que o BASH não tem funções anônimas, mas é possível passar vários comandos para outra função, como você pode fazer ao definir uma função ou while
?
Respostas:
Esta é a solução mais curta que eu consegui pensar:
Dadas estas funções:
Exemplos:
(Esses exemplos são obviamente apenas exemplos de uso e, na realidade, esse estilo só faria sentido para casos de uso mais complicados.)
Geralmente, o seguinte estilo sempre pode ser usado:
Não é bem lambda, mas é muito, muito próximo. Apenas alguns caracteres em excesso.
Mas qualquer uma das abreviaturas de conveniência a seguir não funciona até onde sei:
Infelizmente,
bash
não é muito adequado para esse estilo, embora alguns de seus recursos tenham um estilo muito funcional.fonte
Eu consegui fazer o que você quer com um
eval
hack. Com isso, avisei que a avaliação é insegura e você deve evitar a todo custo . Dito isto, se você confiar que seu código não será abusado, você pode usar o seguinte:Isso permite que você execute o código da seguinte maneira:
Não é exatamente o ideal, pois o bloco interno é uma sequência, mas cria reutilização.
fonte
!!
, para evitar a substituição no heredoc. stackoverflow.com/questions/27920806/…Você pode colocar o código em um fio e passá-lo para
eval
oush
ou simplesmente interpolar-lo.Você pode acabar rapidamente com problemas profundos de citações.
fonte
perform { echo "moo" \n echo "moo moo" \n echo "moo moo moo" }
. Eu já sabia que você pode passar um comando. Mas estou procurando várias linhas, não apenas um comando ou uma linha. Obrigado por tentar.Não, o bash não possui funções anônimas. No entanto, é possível passar um nome de função e argumentos como seqüências de caracteres e ser chamado por bash.
No entanto, isso é um pouco limitado. Lidar com a citação pode se tornar um problema. Passar mais de um comando também é uma complicação.
fonte
$*
para"$@"
wrap my_func "$arg1" "$arg2"
. Meu único problema com este exemplo é que o valor de retorno "$ @" é perdido, mas isso é facilmente remediado. Pode ser desejável agrupar "$ @"()
para garantir que as mudanças ambientais não vazem, com um custo de desempenho de bifurcação.