2008-10-22 8 views
2

Mon $ SHELL est tcsh. Je veux exécuter un script shell qui appellera un programme plusieurs fois avec des arguments modifiés à chaque fois. Le programme que j'ai besoin d'appeler est en Fortran. Je ne veux pas l'éditer. Le programme prend seulement des arguments une fois qu'il est exécuté, mais pas sur la ligne de commande. En appelant le programme dans le script, le programme prend le contrôle (c'est là que je suis actuellement bloqué, je ne peux jamais sortir parce que le script n'exécutera rien tant que le processus du programme ne sera pas arrêté); à ce stade, j'ai besoin de lui passer quelques variables, puis après plusieurs itérations, je devrai ctrl-c hors du programme et continuer avec le script.C Shell: Comment exécuter un programme avec des arguments de ligne sans commande?

Comment cela peut-il être fait?

+0

Est-ce des devoirs semaine? –

+0

Non, il s'avère que lorsque vous essayez de faire de la recherche qui consiste uniquement à écrire du code et que toute votre formation est uniquement en physique, vous manquez les détails de finner cs. Une approche rétrospective du codage avec laquelle tant de personnes vivent. – Alex

Répondre

5

Pour ajouter à ce que dit @Toybuilder, vous pouvez utiliser un "document ici". C'est à dire. votre script pourrait avoir

./myfortranprogram << EOF 
first line of input 
second line of input 
EOF 

Tout entre le « <<EOF » et le « EOF » sera alimenté à l'entrée standard du programme (ne Fortran utilise toujours « lire (5, *) » pour lire l'entrée standard?)

Et parce que je pense @ commentaire de ephemient mérite d'être dans la réponse:

Quelques autres conseils: < < 'EOF' empêche interpolation dans le corps ici-doc; < < -EOF supprime tous les onglets principaux (ainsi, , vous pouvez mettre le document ici en correspondance pour correspondre aux ) et EOF peut être remplacé par n'importe quel jeton . Un jeton vide (< < "") indique un document ici qui arrête à la première ligne vide.

Je ne suis pas sûr de savoir comment ces portables sont ceux, ou si elles sont simplement tcsh extensions - je ne l'ai utilisé le type <<EOF « document en » moi-même.

+0

Encore quelques astuces: << 'EOF' empêche l'interpolation dans le corps du doc-doc; << - EOF supprime tous les onglets principaux (de manière à ce que vous puissiez mettre le document ici en correspondance avec son environnement), et EOF peut être remplacé par n'importe quel jeton. Un jeton vide (<< "") indique un document ici qui s'arrête à la première ligne vide. – ephemient

0

Ce n'est pas un utilisateur , mais si le programme s'exécute, il lit ensuite les commandes via stdin, puis vous pouvez utiliser la redirection de shell < pour lui fournir les commandes requises. Si vous l'exécutez en arrière-plan avec &, vous ne serez pas bloqué lors de son exécution. Ensuite, vous pouvez sleep pour un peu, puis utilisez les outils que vous avez (ps, awk, etc) pour découvrir le PID du programme, puis utilisez kill pour l'envoyer SIGTERM ce qui revient à faire un ctrl-c.

1

Uhm, pouvez-vous alimenter votre code Fortran avec une redirection? Vous pouvez créer un fichier temporaire avec vos entrées, puis le rediriger avec la redirection stdin (<).

0

Il s'agit d'un travail pour le programme Unix, qui peut facilement et de manière interactive commander des programmes et répondre à leurs invites.

0

J'ai été envoyé ici après avoir été dit que ma question était proche d'être une copie de celui-ci. FWIW, j'ai eu un problème similaire avec un script Csh C shell.

Ce morceau de code permettais la custom_command d'exécuter sans avoir des arguments d'entrée:

foreach f ($forecastTimes) 
    custom_command << EOF 
     arg1=x$f;2 
     arg2=ya 
     arg3=z,z$f 
     run 
     exit 
     EOF 
end 

Il ne fonctionnait pas la première fois que je l'ai essayé, mais après que je backspaced sur tout l'espace blanc cette section du code j'ai enlevé l'espace entre le "< <" et le "EOF". J'ai également rétrogradé la fermeture "EOF" tout le chemin à la marge de gauche. Après cela cela a fonctionné:

foreach f ($forecastTimes) 
    custom_command <<EOF 
     arg1=x$f;2 
     arg2=ya 
     arg3=z,z$f 
     run 
     exit 
EOF 
end 
Questions connexes