C Shell: Comment exécuter un programme avec des arguments autres que ceux en ligne de commande?

StackOverflow https://stackoverflow.com/questions/224038

  •  03-07-2019
  •  | 
  •  

Question

Mon $ SHELL est tcsh. Je veux exécuter un script shell c qui appellera un programme plusieurs fois avec des arguments changés à chaque fois. Le programme que je dois appeler se trouve à Fortran. Je ne veux pas le modifier. Le programme ne prend les arguments qu'une fois qu'il est exécuté, mais pas sur la ligne de commande. Lors de l'appel du programme dans le script, le programme prend le contrôle (c'est ici que je suis bloqué, je ne peux jamais sortir car le script n'exécutera rien tant que le processus n'aura pas été arrêté); à ce stade, je dois lui transmettre quelques variables, puis après plusieurs itérations, je devrai quitter le programme en ctrl-c et continuer avec le script.

Comment cela peut-il être fait?

Était-ce utile?

La solution

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

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

Tout ce qui est entre le " <<EOF " et le " EOF " sera alimenté par l'entrée standard du programme (Fortran utilise-t-il toujours & "; read (5, *) &"; pour lire à partir de l'entrée standard?)

Et parce que je pense que le commentaire de @ ephemient mérite de figurer dans la réponse:

  

Quelques conseils supplémentaires: < < 'EOF' empêche   interpolation dans le corps ici doc;   < < -EOF supprime tous les onglets de tête (donc   vous pouvez indenter le here-doc pour correspondre   ses environs), et EOF peut être   remplacé par un jeton. Un jeton vide   (< < " ") indique un doc-here qui s'arrête   à la première ligne vide.

Je ne sais pas dans quelle mesure ceux-ci sont portables, ou s’ils ne sont que des extensions tcsh - j’ai utilisé uniquement le <=> type & "here document &"; moi-même.

Autres conseils

Ce que vous voulez utiliser, c'est Expect .

Euh, pouvez-vous nourrir votre code Fortran avec une redirection? Vous pouvez créer un fichier temporaire avec vos entrées, puis l'acheminer avec la redirection stdin (& Lt;).

Pas un tcsh utilisateur, mais si le programme s'exécute, il lit les commandes via stdin, vous pouvez utiliser la redirection du shell < pour lui fournir les commandes requises. Si vous l’exécutez en arrière-plan avec &, vous ne bloquerez pas son exécution. Ensuite, vous pouvez sleep passer un moment, puis utiliser les outils dont vous disposez (ps, grep, awk, etc.) pour découvrir le PID du programme, puis utiliser kill pour l'envoyer SIGTERM, qui est la même chose que de faire un ctrl-c.

C’est un travail pour le programme unix attendu, qui peut commander facilement et de manière interactive les programmes et répondre à leurs invites.

J'ai été envoyé ici après avoir appris que ma question était proche du double de celle-ci.

FWIW, j’ai eu un problème similaire avec un script de shell Csh C.

Ce bit de code permettait à la commande_personne de s'exécuter sans obtenir AUCUN argument d'entrée:

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

Cela n’a pas fonctionné la première fois que j’ai essayé, mais après avoir supprimé l’espace blanc de cette partie du code, j’ai supprimé l’espace entre les & «; < &. lt; " et le " EOF " ;. J'ai également annulé la fermeture & Quot; EOF & Quot; tout le chemin à la marge gauche. Après cela a fonctionné:

foreach f ($forecastTimes)
    custom_command <<EOF
        arg1=x$f;2
        arg2=ya
        arg3=z,z$f
        run
        exit
EOF
end
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top