Utilisez le fichier ICI et redirigez la sortie de la commande

11

J'ai le code suivant dans un script batch:

mpirun -np 6 ./laplace <<END
100
100
100
0.01
100
3
2
1
END
| tail -n 1 > output

Mais ça ne marche pas. Ce que je veux, c'est utiliser le fichier ICI comme entrée pour la commande mpirun, puis diriger la sortie vers la commande tail. Cependant, je pense que le fichier ICI et la sortie de la queue se confondent.

Comment dois-je écrire ceci pour qu'il fasse ce que je veux?

robintw
la source

Réponses:

12

Ce que vous avez écrit dans la première ligne ressemble à une commande complète (une «liste (composée)» dans la terminologie du shell), donc le shell la traite comme une commande complète. Puisqu'il y a un marqueur de début ici-document ( <<END), le shell lit ensuite le contenu ici-document, puis démarre une nouvelle commande. Si vous voulez mettre le document ici au milieu d'une liste, vous devez indiquer au shell que la liste n'est pas terminée. Voici deux façons.

mpirun -np 6 ./laplace <<END |

END
tail -n 1 > output
{ mpirun -np 6 ./laplace <<END

END
} | tail -n 1 > output

Ou bien sûr, vous pouvez vous assurer que la commande tient parfaitement dans la première ligne.

mpirun -np 6 ./laplace <<END | tail -n 1 > output

END

La règle à retenir est que le contenu du document ICI commence après la première nouvelle ligne sans guillemets après l' <<ENDindicateur. Par exemple, voici une autre façon brouillée d'écrire ce script:

mpirun -np 6 ./laplace <<END \
| tail -n $(

END
             echo 1) > output
Gilles 'SO- arrête d'être méchant'
la source
Ce dernier! "obscurci" .. Vous ne plaisantez pas! :) .. J'étais tombé sur l'idée de la nouvelle ligne dure, mais en fait, couper un bloc entre crochets comme celui-ci frôle le bizzare .. Est-ce par conception ou est-ce une aberration coïncidente?. (par exemple. y a-t-il une utilité réelle à cela? ... et vous pouvez même mettre plusieurs commandes séparées par des points-virgules dans cette première ligne "douce" ..
Peter.O
@fred: Juste une aberration fortuite. Il doit y avoir une règle quant à l'endroit où l'hérédoc commence et s'arrête. Ici, la règle est que l'hérédoc est comme un seul jeton attaché au prochain jeton de nouvelle ligne après le <<ENDbit. Une nouvelle barre oblique inversée annule la nouvelle ligne.
Gilles 'SO- arrête d'être méchant'
7
mpirun -np 6 ./laplace <<END | tail -n 1 > output
100
100
100
0.01
100
3
2
1
END
rien
la source