Utilisez & (esperluette) dans une boucle bash sur une seule ligne

58

J'ai utilisé cette commande avec succès, ce qui change une variable dans un fichier de configuration, puis exécute un script Python dans une boucle:

for((i=114;i<=255;i+=1)); do echo $i > numbers.txt;python DoMyScript.py; done

Comme chacune d’entre DoMyScript.pyelles prend environ 30 secondes avant de se terminer, je voudrais les reléguer à l’arrière-plan pendant que la suivante peut être générée.

J'ai essayé ce que je connais en ajoutant une esperluette comme ci-dessous:

for((i=114;i<=255;i+=1)); do echo $i > numbers.txt;python DoMyScript.py &; done

Cependant, cela entraîne l'erreur ci-dessous:

-bash: erreur de syntaxe près d'un jeton inattendu `; '

ljs.dev
la source

Réponses:

85

Laisse tomber l' ;après &. Ceci est une exigence syntaxique

for((i=114;i<=255;i+=1)); do echo $i > numbers.txt;python DoMyScript.py & done
iruvar
la source
1
Bon sang, 43 secondes trop lent :)
Martin von Wittich
2
@MartinvonWittich, un +1 à votre réponse en guise de commisération ;-)
iruvar
4
Bien que cela réponde à la question, ce n'est probablement pas ce que veut le PO, car au moment où toutes les instances de Python ont démarré et sont initialisées, elles verront toutes un numbers.txtconteneur 255.
Stéphane Chazelas
1
D'accord avec @StephaneChazelas, mais je ne suis pas sûr de ce que nous pouvons vraiment faire à ce sujet avec les informations fournies dans la question. Une solution appropriée à cette question nécessite probablement plus de contexte.
un CVn
3
Voici la référence du manuel bash: gnu.org/software/bash/manual/bashref.html#Lists
glenn jackman
14

Compte tenu du commentaire de Stéphane sur la réponse de 1_CR , vous voulez probablement:

for i in {114..255}; do { echo $i > numbers.txt && python DoMyScript.py; } & done
Glenn Jackman
la source
Merci Glenn. J'ai essayé quelques variantes de votre code qui me plaisaient en raison de la lisibilité accrue, mais peut-être en raison du temps de sommeil supplémentaire dont j'avais besoin, cela ne fonctionnait pas pour moi. Cela répèterait également le dernier chiffre de la forplage ... Voici ce qui me rend heureux pour le moment: for((i=1;i<100;i+=1)); do echo $i > numbers.txt;sleep 3; python DoMyScript.py & donele principal problème qui consiste à obtenir l'exécution du processus en arrière-plan est résolu.
ljs.dev
* Bien sûr, comme je l'avais <=dans la question d'origine, la gamme que vous avez fournie était parfaitement adaptée aux informations fournies. Encore une fois, merci pour l'approche différente
ljs.dev
10

Perdre le ;:

for((i=114;i<=255;i+=1)); do echo $i > numbers.txt;python DoMyScript.py & done
Martin von Wittich
la source