Запустите «N» сценарии оболочки в папке - PullRequest
1 голос
/ 03 апреля 2019

У меня есть рабочий кусок кода для запуска всех сценариев в каталоге: Запустить все сценарии оболочки в папке

for f in *.sh; do \
bash "$f" -H || break
done

У меня также есть код для запуска последовательности сценариев .sh:

for f in {1..3}madeupname.sh; do \
bash "$f" -H || break
done

Теперь вместо того, чтобы запускать все сценарии .sh или диапазон сценариев .sh, я хочу запустить «N» число сценариев .sh, где N - произвольное число, например, 3 сценария .sh.

Порядок запуска N файлов для меня не важен.

Ответы [ 2 ]

5 голосов
/ 03 апреля 2019

find сценарии, получите head, затем выполните с xargs.

find . -name '*.sh' | head -n 10 | xargs -n1 sh

Вы можете запускать сценарии параллельно с xargs с простой опцией -P0.Вы можете написать xargs с некоторыми xargs sh -c 'bash "$@" -H || exit 125' --, чтобы xargs завершить работу с ненулевым статусом или сразу после того, как какой-либо из сценариев не запустится или что-то в этом роде.

Если вы чувствуете, что не знакомы с xargs,просто выполните простой цикл while read:

find . -name '*.sh' | head -n 10 | 
while IFS= read -r script; do
    bash "$script" -H || break
done

И параллельно вы должны выйти из подоболочки канала:

while IFS= read -r script; do
    bash "$script" -H || break &
done < <(
     find . -name '*.sh' | head -n 10
)
wait # for all the childs

или подождать потомков в самом подоболочке:

find . -name '*.sh' | head -n 10 |
{
    while IFS= read -r script; do
        bash "$script" -H || break &
    done
    wait
}
1 голос
/ 03 апреля 2019

Из комментариев, ведение счета запуска процесса

count=0
for f in *.sh; do
    bash "$f" -H || break
    ((++count>=3)) && break
done
...