Come controllare automaticamente le modifiche ai file ed eseguire un'azione personalizzata all'interno della shell?

6

Ad esempio, vorrei eseguire automaticamente YUI Compressor ogni volta che modifico un file sorgente JavaScript per produrre un versione compressa.

Idealmente il processo non viene eseguito in background ma in una shell dedicata, quindi posso terminare facilmente il processo alla fine della giornata.

Quale sarebbe il modo più pulito e flessibile per guardare file e / o directory specifici per le modifiche ai file ed eseguire un'azione personalizzata all'interno di una shell?

    
posta Gerry 07.08.2012 - 11:00
fonte

2 risposte

2

Il $ 25 Codekit controlla cartelle e file per le modifiche e comprime / ridimensiona / combina i file JavaScript e CSS.

So che questa è solo una risposta parziale alla tua domanda, in quanto non è un watcher generico, ma si adatta al tuo esempio:

whenever I edit a JavaScript source file to output a compressed version

    
risposta data 07.08.2012 - 14:48
fonte
1

La visione di un file per le modifiche può essere eseguita con un LaunchAgent. Ad esempio, crea un file plist in ~/Library/LaunchAgents/watch.and.lol.plist e inseriscilo con questo contenuto:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>watch.and.lol</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/Shared/changeAction.sh</string>
        <string>-force</string>
    </array>
    <key>WatchPaths</key>
    <array>
        <string>/private/var/radmind/client/.radmindOnDemand</string>
    </array>
</dict>
</plist>

Ora assicurati che il file /private/var/radmind/client/.radmindOnDemand esista. Quindi carica il launchagent con il comando $ launchctl load ~/Library/LaunchAgents/watch.and.lol.plist . Non appena il file ~/Library/LaunchAgents/watch.and.lol.plist non esiste più, questo lavoro launchagent verrà scaricato.

Ora scrivi alcuni script di shell che guardano il tuo file alla ricerca di modifiche, come:

chsum1=""

while [[ true ]]
do
    chsum2='md5 /private/var/radmind/client/.radmindOnDemand'
    if [[ $chsum1 != $chsum2 ]] ; then           
        compile
        chsum1='md5 /private/var/radmind/client/.radmindOnDemand'
    fi
    sleep 2
done

Nota: questo script di shell richiede un lavoro extra da fare per renderlo efficiente. Ora esegue il polling ogni 2 secondi ( sleep 2 ). È meglio uscire dallo script dopo l'esecuzione del comando compile . Ciò richiede la memorizzazione dell'output del comando hash md5 che può sopravvivere all'uscita e al relauch di questo script di shell.

    
risposta data 07.08.2012 - 18:00
fonte

Leggi altre domande sui tag