2010-11-14 5 views
1

Pourquoi la sortie standard des commandes suivantes diffère-t-elle?Utilisation de bash -c avec des boucles et redirection de sortie standard

command1:

for ((i=0; i<10; i=i+1)); do echo $i; done 

commande_2:

bash -c "for ((i=0; i<10; i=i+1)); do echo $i; done" 

command1 imprime les nombres entiers de 1 à 10 sur une ligne séparée, comme prévu. command2 imprime 10 sur chaque ligne.

Que dois-je faire pour que command2 imprime la même chose que command1?

La longue histoire:

J'ai souvent besoin de lancer un exécutable sur un grand nombre de fichiers et de capturer la sortie de l'ensemble du processus. J'utilise une boucle for similaire à command1 dans un fichier séparé appelé my_script.sh.

Je peux alors obtenir la sortie en utilisant:

bash my_script.sh > results.txt 

Comme il est un peu une douleur pour créer un fichier my_script.sh séparé pour trivial pour les boucles, j'espérais réaliser la même chose en utilisant " bash -c ", mais a couru dans ce problème.

Merci pour vos suggestions. Dans l'attente de réponses.
Misha

Répondre

9

Que dois-je faire pour obtenir commande_2 d'imprimer la même chose que command1?

Vous devez corriger cette ligne:

bash -c "for ((i=0; i<10; i=i+1)); do echo $i; done" 

Dire ceci:

bash -c "for ((i=0; i<10; i=i+1)); do echo \$i; done" 

Ce qui se passe est que la séquence $i est interprétée par le shell que vous utilisez bash de et il substitue sa propre variablei dans la chaîne avant de la transmettre à la nouvelle instance bash à exécuter. Donc, au moment où la nouvelle bash voit la chaîne, il est:

for ((i=0; i<10; i=i+1)); do echo 10; done 

En supposant que i contenait la valeur « 10 ».

(Quand je courais le second script, que je l'ai fait avant de lancer le premier, il a écrit sur 10 lignes vides, parce que j'avais aucune variable i définie, et il remplaçais donc dans la chaîne vide).

+4

Ou vous pouvez simplement changer les guillemets doubles en guillemets simples. –

+0

Yup, l'une ou l'autre approche va fonctionner. Tout ce qui obtient le shell externe pour traiter le '$' littéralement. – cdhowie

+0

'$ i' serait' 10' si vous avez exécuté la commande 2 après la commande 1, bien sûr. – Johnsyweb

Questions connexes