Можно ли рассматривать блок команд как анонимную функцию?
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
}
(Я понимаю, что вы создаете функцию или файл для каждого блока, но я нахожу эту опцию более ясной и удобной для чтения в определенных ситуациях.)
while
делает это с do/done
и function
делает это с { multiple lines }
. Я понимаю, что BASH не имеет анонимных функций, но возможно ли передать несколько команд другой функции, как вы можете сделать при определении функции или while
?
Ответы:
Это самое короткое решение, о котором я мог подумать:
Учитывая эти функции:
Примеры:
(Эти примеры, конечно, являются просто примерами использования, и в действительности этот стиль имеет смысл только для более сложных вариантов использования.)
Как правило, всегда можно использовать следующий стиль:
Это не совсем лямбда, но это очень, очень близко. Всего несколько лишних символов.
Но ни одно из следующих сокращений удобства не работает, насколько я могу сказать:
К сожалению,
bash
не очень хорошо подходит для этого стиля, хотя некоторые его особенности имеют очень функциональный стиль.источник
Мне удалось сделать то, что вы хотите с помощью
eval
взлома. При этом я предупредил, что eval небезопасен, и вам следует избегать любой ценой . Сказав это, если вы уверены, что ваш код не будет злоупотреблять, вы можете использовать это:Это позволяет запускать код следующим образом:
Не совсем идеально, поскольку внутренний блок является строкой, но создает повторное использование.
источник
!!
чтобы предотвратить подстановку в heredoc. stackoverflow.com/questions/27920806/…Вы можете поместить код в строку и передать его
eval
илиsh
или просто интерполировать его.Тем не менее, вы можете быстро обернуться неприятностями.
источник
perform { echo "moo" \n echo "moo moo" \n echo "moo moo moo" }
. Я уже знал, что вы можете передать одну команду. Но я ищу несколько строк, а не только одну команду или одну строку. Спасибо за попытку.Нет, Bash не имеет анонимных функций. Тем не менее, можно передать имя функции и аргументы в виде строк и заставить ее вызывать bash.
Это, однако, несколько ограничено. Работа с цитированием может стать проблемой. Передача более чем одной команды также является осложнением.
источник
$*
в"$@"
wrap my_func "$arg1" "$arg2"
. Одно из моих замечаний в этом примере заключается в том, что возвращаемое значение «$ @» потеряно, но это легко исправить. Может быть желательно обернуть "$ @",()
чтобы избежать изменений в окружающей среде при некоторых затратах на производительность.