Como fazer algo apenas uma vez, sempre

1

Estou escrevendo um script que baixa alguns arquivos e os executa. Eu quero apenas que cada nome de arquivo seja executado uma vez pelos hosts que estão fazendo o download deles. Eu estou tentando criar um script que puxa os arquivos, executa-os se eles já não foram executados e, em seguida, controla cada arquivo que foi executado para evitar execuções duplicadas. Até agora tudo o que pareço ser capaz de fazer é executar todas as vezes, e o registro de backup não aciona a exclusão das duplicatas.

(cd /opt/trunk/mythos/medusa/remote-scripts/ && wget -r --no-parent --reject "index.html*" http://server/medusa/scripts/)
chmod +x /opt/trunk/mythos/medusa/remote-scripts/server/medusa/scripts/*.sh
for each in /opt/trunk/mythos/medusa/remote-scripts/server/medusa/scripts/*.sh
do
    if /usr/bin/test -e $each.bak
    then
        rm -rf /opt/trunk/mythos/medusa/remote-scripts/server/medusa/scripts/$each
    fi
    bash $each
    mv $each $each.bak
done

O que estou fazendo de errado?

    
por spyderdyne 19.11.2015 / 21:22

1 resposta

2

Coloque bash $each e mv $each $each.bak em um bloco else :

(cd /opt/trunk/mythos/medusa/remote-scripts/ && wget -r --no-parent --reject "index.html*" http://server/medusa/scripts/)
chmod +x /opt/trunk/mythos/medusa/remote-scripts/server/medusa/scripts/*.sh
for each in /opt/trunk/mythos/medusa/remote-scripts/server/medusa/scripts/*.sh
do
    if /usr/bin/test -e "$each.bak"
    then
        rm -rf "/opt/trunk/mythos/medusa/remote-scripts/server/medusa/scripts/$each"
    else
        bash "$each"
        mv "$each" "$each.bak"
    fi
done

Dessa forma, o script atual será executado e movido apenas se /usr/bin/test -e "$each.bak" falhar (ou seja, o script atual não tiver sido executado e movido anteriormente).

Eu citei todas as variáveis com aspas duplas para evitar que eles quebrassem os comandos caso eles acabassem contendo caracteres / strings estranhos.

    
por kos 19.11.2015 / 22:08