L'altro giorno ho testato alcuni script di shell di base che ho creato per divertimento. Dal momento che sono nuovo nello scripting della shell, ho eseguito e testato gli script uno per uno. Era OK se ci sono solo pochi script. Con l'aumento del numero di script, trovo che sia un po' dispendioso in termini di tempo testarli tutti. Dopo un po' di ricerca sul web, ho scoperto un paio di metodi per eseguire tutti gli script in una directory in Linux, uno dopo l'altro.
Esegui tutti gli script in una directory in Linux
Ho un paio di script nella mia directory Documenti.
$ ls Documents/ linux.sh ostechnix.sh script1.sh script2.sh script3.sh script4.sh
Sono tutti semplici script di shell one-liner che visualizzano le stringhe date usando il comando "echo" nell'output standard.
Prima di sapere che possiamo eseguire tutti gli script in una cartella, di solito rendevo lo script eseguibile come:
$ chmod +x script.sh
Quindi lo eseguo usando il comando:
$ ./script.sh
Oppure,
$ sh script.sh
Ancora una volta, rendo eseguibile il secondo script, lo eseguo e così via.
Bene, c'è un modo migliore per farlo. Possiamo eseguire tutti gli script in una directory o in un percorso utilizzando "run-parts" comando. Il comando run-parts viene utilizzato per eseguire script o programmi in una directory o in un percorso.
$ run-parts <directory-path>
Uno svantaggio del comando run-parts è che non eseguirà tutti gli script. Funzionerà solo se i tuoi script hanno i nomi corretti. I nomi devono essere costituiti interamente da lettere maiuscole e minuscole ASCII, cifre ASCII, caratteri di sottolineatura ASCII e trattini meno ASCII.
Per risolvere questo problema di denominazione, possiamo utilizzare la regex opzione. Ad esempio, il comando seguente troverà ed eseguirà tutti i file di script in ~/Documents directory che inizia con la lettera 's' e termina con l'estensione 'sh':
$ run-parts --regex '^s.*sh$' ~/Documents
Esegui tutti gli script in una directory in Linux con il comando run-parts
Risoluzione dei problemi:
Se hai riscontrato un errore simile a quello riportato di seguito;
run-parts: failed to exec Documents/script1.sh: Exec format error
Fare riferimento alla seguente guida per risolverlo.
- Correzione "Errore di formato Exec" durante l'esecuzione di script con il comando run-parts
Allo stesso modo, per eseguire tutti i file di script che terminano con .sh nella directory Documenti, eseguire:
$ run-parts --regex '.*sh$' ~/Documents
Per stampare i nomi di tutti i file nella directory Documenti che iniziano con la lettera 's' e terminano con l'estensione 'sh', eseguire:
$ run-parts --list --regex '^s.*sh$' Documents Documents/script1.sh Documents/script2.sh Documents/script3.sh Documents/script4.sh
Questo comando stamperà solo il nome dei file di script, ma non li eseguirà.
Per elencare tutti i file che terminano con .sh nella directory Documenti, esegui:
$ run-parts --list --regex '.*sh$' Documents Documents/linux.sh Documents/ostechnix.sh Documents/script1.sh Documents/script2.sh Documents/script3.sh Documents/script4.sh
Il comando run-parts viene utilizzato principalmente da cron jobs e non è affidabile per l'utilizzo manuale.
Un altro modo per evitare di dover rinominare i tuoi script per adattarli a run-parts struttura dei nomi, puoi utilizzare trova o ciclo continuo comandi.
Per trovare ed eseguire tutti i file di script che iniziano con la lettera "s" nella cartella ~/Documenti, esegui:
$ find ~/Documents -maxdepth 1 -type f -executable -name 's*' -exec {} \;
Se desideri eseguire tutti gli script nella directory specificata e in tutte le sue sottodirectory, rimuovi maxdepth opzione nel comando precedente:
$ find ~/Documents -type f -executable -name 's*' -exec {} \;
Per eseguire tutti gli script che terminano con l'estensione .sh" , esegui:
$ find ~/Documents -maxdepth 1 -type f -executable -name '*.sh' -exec {} \;
Trova ed esegui tutti gli script in una directory in Linux usando il comando trova
Questo metodo ha anche un piccolo svantaggio. Questo comando può eseguire solo gli script che possono essere interpretati dalla tua shell corrente. Se vuoi eseguire tutti i tipi di script, ad esempio awk, perl, python, script di shell, usa for loop metodo come di seguito.
$ for f in ~/Documents/s* ; do [ -x "$f" ] && [ ! -d "$f" ] && "$f" ; done
Il comando precedente eseguirà gli script che iniziano con la lettera "s" nella cartella ~/Documents. Se vuoi eseguire tutti i file che terminano con l'estensione ".sh", esegui:
$ for f in ~/Documents/*.sh ; do [ -x "$f" ] && [ ! -d "$f" ] && "$f" ; done
Per maggiori dettagli, fare riferimento alle pagine man.
$ man run-parts
$ man find
Spero che questo aiuti.