Да, вы можете, но если вы объявите массив факториалов в цикле, он будет доступен только в этом замыкании. Так что утешить его из цикла не получится.
Вот очень информативная статья о замыканиях: https://javascript.info/closure
Весь сайт javascript.info очень интересный, сейчас я его изучаю, чтобы укрепить мои основы JavaScript и заполнить неизвестные информационные дыры, хотя я занимаюсь веб-разработкой уже много лет. Но никогда не бывает больно получать больше знаний, даже если это основа.
Также я бы посоветовал вам использовать «используйте строгий»; с самого начала разработки, это помогает сохранить ваши сценарии более чистыми, не допуская источников ошибок.
Параллелизм Make особенно удобен для сценариев оболочки. Скажите, что Вы хотите получить 'время работы' полного набора хостов (или в основном выполнить любую медленную операцию). Вы могли сделать это в цикле:
cat hosts | while read host; do echo "$host: $(ssh $host uptime)"; done
Это работает, но медленно. Можно параллелизировать это путем порождения подоболочек:
cat hosts | while read host; do (echo "$host: $(ssh $host uptime)")&; done
Но теперь Вы не имеете никакого контроля, сколько потоков Вы мечете икру, и CTRL-C чисто не прервет все потоки.
Вот Сделать решение: сохраните это в файл (например. showuptimes
) и метка как исполняемый файл:
#!/usr/bin/make -f
hosts:=$(shell cat)
all: ${hosts}
${hosts} %:
@echo "$@: `ssh $@ uptime`"
.PHONY: ${hosts} all
Теперь выполнение cat hosts | ./showuptimes
распечатает времена работы один за другим. cat hosts | ./showuptimes -j
выполнит их всех параллельно. У вызывающей стороны есть прямое управление степенью распараллеливания (-j
), или может указать его косвенно системной нагрузкой (-l
).
Кроме очевидного использования в программировании, я видел, что Make-файлы раньше выполняли повторяющиеся задачи на серверах для управления параметрами настройки системы, такими как создание пользователя/группы, обновления/обновления пакета и копирование файлов конфигурации в место. Я также видел (и использовал), грабли, чтобы сделать это в основанных на Ruby средах.
Самым сложным примером этого, о котором я услышал, является ISConf, инструмент управления конфигурацией. Я слышал об этом от Luke Kanies, автора Марионетки, на его блоге.
В зависимости от разнообразия 'делают', можно приплыть через зависимости задач при помощи исполняемых make-файлов по сравнению со сценариями оболочки.. т.е. в сценарии, где один init сценарий должен запустить 10 сервисов... один за другим (т.е. сервис две потребности обслуживают для возрастания и живы до запуска), его легко сделанный через make-файл.
Много поставщиков программного блока GNU/Linux использует это, т.е. debian/rules и других. Так да, если сделано правильно, сделайте, так же хорошо в запуске программ, как он как создает их.
Проблема, не всем установили набор инструментальных средств сборки.. таким образом, сценарии оболочки или пакетные файлы остаются портативным устройством (следовательно 'корректный') подход.
Это, вероятно, означает, что мое воображение является несовершенным, но трудно получить достаточную гибкость в make-файл для такого использования. 'Очевидный' способ достигнуть его состоит в том, чтобы указать макро-значения на'make
'командная строка.
make -f script.mk MACRO="list of files on which to operate"
Это является более подробным, чем простой сценарий оболочки - и Вы теряете легкую способность использовать расширение имени файла оболочки. Обходное решение для этого:
make -f script.mk MACRO="$(echo *[io]*)"
Я предложил бы этому ТАК вопрос о, Почему бы не использовать #!/bin/make во главе make-файлов как нечетное использование (исполняемых) make-файлов, но цель там не состояла в том, чтобы сделать необычных вещей (просто скучные старые сборки программного обеспечения); только использовать необычный механизм вызова для make
.
Используя технику, Вы могли упростить вызов до:
script.mk MACRO="$(echo *[io]*)"
Это является еще более подробным, чем:
script *[io]*
Я предполагаю script
мог быть записан, чтобы сделать вызов make
. Все это зависит. Я не убежден, что существует достаточно пробега, который будет получен из него; YMMV.
Моя работа использует любопытный: зависимости не существуют так, это всегда восстанавливает все.
Возможно, также использовал пакетный файл.