Я пишу сценарий на BASH, который в основном действует как упрощенный конструктор пакетов и gmake. Он поддерживает только один язык; это сделано намеренно. Я не собираюсь публиковать этот скрипт, так как он предназначен только для локального использования.
У меня в основном все работает правильно. На более сложных проектах все справлялось нормально. Проблема возникла при выполнении простой тестовой программы.
Сценарий создает «аргументы» до разумных значений по умолчанию с основными параметрами. Независимо от «режима» скрипт всегда выполняет строку следующего вида:
«compiler» «args» *.«ext»
Учитывая, что поддерживаемый язык (Ada) имеет два расширения файлов, следующий глобус используется при компиляции как «ext»:
*.{ads,adb}
Когда существуют оба расширения, как и следовало ожидать в более крупных проектах, все в порядке. Но сценарий не работает, и компиляция не происходит, если в $ PWD существует только одно из расширений.
Меня это довольно смущает, потому что существует "чистый режим", который просто выполняет:
rm *.{ali,o,so}
и это работает, даже если некоторые из перечисленных расширений не существуют в $ PWD.
Я мог бы вызвать компилятор дважды, передав сначала одно расширение, если для него существуют файлы, а затем аналогичным образом передать другое расширение. Однако это приводит к тому, что компиляция выполняется дважды для многих файлов, что является очевидной неэффективностью.
Я думаю, можно было бы создать глобус в начале сценария о том, какие расширения существуют в $ PWD, а затем передать глобус компилятору. Однако я совершенно не представляю, как этого добиться. При некоторых попытках bash жалуется, что команда "*. {Adb, ads}" не может быть найдена. Это действительно было для меня сюрпризом, поскольку я, по сути, просто делал:
«compiler» «args» $FoundFiles