Как использовать globstar на bash старше v4

432
DiAlex

Мы используем эту команду для запуска всех тестов с использованием mocha :mocha ./src/test/**/*.js --recursive

Обратите внимание на двойной **. Он отлично работает на любом современном bash, кроме системы CI, с которой работает RedHat GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu).

Я читал, что v3 не поддерживает двойной Globstar .

  • Я попытался включить его, выполнивshopt -s globstar
    • но не смог сказать shopt: globstar: invalid shell option name.
  • Я попросил devops клиента обновить Bash
    • но он сказал: «это не показывает мне, что доступна новая версия bash».
  • Этот другой ответ не помог.

Вопрос: Как я могу выполнить команду с **Linux Bash v3. *? Любое решение?

0

1 ответ на вопрос

5
grawity

Если он не поддерживает globstar, то он не поддерживает его.

Тем не менее, большую часть времени вы можете адаптировать find, xargsи / или аналогичные инструменты. Ваш случай довольно прост, все в одном каталоге, поэтому:

find src/test -name "*.js" -exec mocha --recursive {} +  find src/test -name "*.js" -print | xargs -d '\n' mocha --recursive 

( find ставит имена файлов вместо {}, а xargs добавляет их в конец. Таким образом, в обоих случаях повторяющиеся аргументы должны идти в конце после всех опций --option, но это не должно быть проблемой для большинства программ.)

В качестве альтернативы, если запускать mocha один раз для каждого файла нормально, то:

find src/test -name "*.js" -exec mocha {} --recursive \; 

Сравните -exec … \;(по одному файлу за раз) и ранее -exec … +(как можно больше).

Примечание. Во всех приведенных выше примерах "*.js"знак должен заключаться в кавычки, потому что вы хотите findобрабатывать его, а не оболочку.