2009-12-26 4 views
3

quand je veux exécuter un script shell sous Unix (et disons que je suis dans le répertoire où le script est), je viens de taper:Unix - comment générer plusieurs scripts shell dans un répertoire?

./someShellScript.sh 

et quand je veux « source »(par exemple l'exécuter dans le shell actuel, pas dans un nouveau shell), je tape juste la même commande juste avec le "." (ou avec la commande "source" équivalent) avant:

. ./someShellScript.sh 


Et maintenant, la partie la plus délicate. Quand je veux exécuter « plusieurs » scripts shell (disons tous les fichiers avec .sh suffixe) dans le répertoire courant, type I:

find . -type f -name *.sh -exec {} \; 

mais « quelle commande dois-je utiliser pour » SOURCE "plusieurs scripts shell dans un répertoire"?
J'ai essayé jusqu'à présent, mais ça n'a pas marché:

find . -type f -name *.sh -exec . {} \; 

et il ne jetait cette erreur:

find: `.': Permission denied 


Merci.

+0

Bien sûr. Trouver les commandes et n'est pas un shell. Il a apparemment essayé d'exécuter le répertoire courant, '.', ce qui est un peu futile :-) – Jens

Répondre

13
for file in *.sh 
do . $file 
done 
+0

Merci. Mais ce que j'ai eu aussi quelques "répertoires se terminant par" .sh "" dans le répertoire courant. Le script va essayer d'exécuter tous les fichiers MAIS aussi "tous les répertoires", n'est-ce pas? N'y a-t-il aucune restriction uniquement aux fichiers? – Petike

+3

'[-f $ file] &&. $ file' – ephemient

+0

Merci. Je suis tellement bête :-). – Petike

0

Essayez la version suivante du code de Jonathan:

export IFSbak = $IFS;export IFS="\0" 
for file in `find . -type f -name '*.sh' -print0` 
do source "$file" 
end 
export IFS=$IFSbak 

Le problème réside dans le travail de la coquille de manière, et que '' lui-même n'est pas une commande (ni la source dans ce cas). Lorsque vous lancez find, le shell se redimensionne et se transforme en processus de recherche, ce qui signifie que toutes les variables d'environnement ou autres éléments environnementaux entrent dans le processus de recherche (ou, plus probablement, trouvent eux-mêmes de nouveaux processus pour chaque exec). Notez également que votre commande (et celle de Jonathan) ne fonctionnera pas s'il y a des espaces dans les noms de fichiers.

+0

L'utilisation de find est inutile car il le fait dans le répertoire courant. doivent également prendre soin des espaces dans les noms de fichiers. – ghostdog74

0

Vous pouvez utiliser find et xargs pour ce faire:

find . -type f -name "*.sh" | xargs -I sh {} 
Questions connexes