executa todos os scripts em um diretório

4

Eu gostaria de criar um script de shell que, por sua vez, executa todos os scripts que encontrar em um determinado diretório.

As seguintes restrições devem ser aplicadas:

  • os scripts devem ser executados em ordem alfabética

  • scripts de backup (também conhecidos como scripts que parecem com scripts de backup típicos, como foo~ ou bar.bak ) devem ser omitidos.

  • argumentos devem ser passados para os scripts

  • somente "scripts" (arquivos executáveis e provavelmente links simbólicos apontando para arquivos executáveis) devem ser executados

Eu acho isso um padrão comum em configurações divididas (no meu sistema Debian), e eu gosto bastante disso.

Agora criei um script de inicialização simples que parece fazer tudo isso:

#!/bin/sh

SCRIPTDIR=/etc/scripts/up.d

for SCRIPT in "${SCRIPTDIR}/"*
do
  case "${SCRIPT}" in
  *~|*.bak)
     continue
  ;;
  *)
     if [ -f "${SCRIPT}" -a -x "${SCRIPT}" ]; then
       "${SCRIPT}" $@
     fi
  ;;
  esac
done

Como o padrão é tão comum, me pergunto se já existe um script desse tipo instalado no meu sistema, que supostamente viu mais testes e correções de bugs do que o meu. no entanto não consigo encontrar um.

Você conhece um script inicial nos sistemas Debian?

    
por umläute 09.03.2015 / 21:44

1 resposta

7

Você pode usar o comando run-parts :

run-parts  runs  all  the  executable  files  named  within constraints
described  below,  found  in  directory  directory.   Other  files  and
directories are silently ignored.

If neither the --lsbsysinit option nor the --regex option is given then
the names must consist entirely of ASCII upper- and lower-case letters,
ASCII digits, ASCII underscores, and ASCII minus-hyphens.

As restrições padrão ignoram arquivos com extensões, tils, etc. Você pode passar vários argumentos passando várias opções --arg para run-parts :

-a, --arg=argument
        pass  argument to the scripts.  Use --arg once for each argument
        you want passed.

Você pode construir a lista de argumentos a ser passada:

for i; do args+=(" -a '$i'"); done
run-parts ... "${args[@]}" ...

É usado, por exemplo, pelo padrão crontab para executar os scripts nos vários diretórios cron.* .

    
por 09.03.2015 / 21:53

Tags