2

私の $SHELL は tcsh です。毎回いくつかの引数を変更してプログラムを何度も呼び出す C シェル スクリプトを実行したいと考えています。呼び出す必要があるプログラムは Fortran です。編集したくありません。プログラムは実行時にのみ引数を受け取りますが、コマンド ラインでは受け取りません。スクリプトでプログラムを呼び出すと、プログラムが制御を取得します (これは私が現在立ち往生している場所です。プログラム プロセスが停止するまでスクリプトは何も実行しないため、抜け出すことはできません)。この時点で、いくつかの変数を渡す必要があります。その後、数回繰り返した後、プログラムを終了してスクリプトを続行する必要がありCtrlます。C

これはどのように行うことができますか?

4

6 に答える 6

5

@Toybuilder の発言に追加するには、「ヒア ドキュメント」を使用できます。つまり、あなたのスクリプトは

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

<<EOF" " と" "の間のすべてがEOFプログラムの標準入力に供給されます (Fortran は標準入力から読み取るためにまだ "read (5,*)" を使用しますか?)

そして、@ ephemientのコメントは答えに値すると思うからです:

その他のヒント: <<'EOF' は、ヒアドキュメント本体での補間を防ぎます。<<-EOF は先頭のタブをすべて削除し (そのため、ヒアドキュメントをインデントして周囲に合わせることができます)、EOF は任意のトークンに置き換えることができます。空のトークン (<<"") は、最初の空の行で停止するヒアドキュメントを示します。

それらがどれほど移植性があるか、または単に tcsh 拡張機能であるかどうかはわかりません。私自身は<<EOF「ヒア ドキュメント」タイプしか使用していません。

于 2008-10-22T00:33:24.433 に答える
2

使いたいのはExpectです。

于 2008-10-22T00:21:47.683 に答える
1

Fortran コードにリダイレクトを追加できますか? 入力で一時ファイルを作成し、stdin リダイレクト (<) でパイプすることができます。

于 2008-10-22T00:19:05.227 に答える
0

これは、プログラムに適切かつ簡単にインタラクティブにコマンドを実行し、プロンプトに応答できる unix プログラム expect の仕事です。

于 2008-10-22T01:19:49.330 に答える
0

私の質問がこの質問の複製に近いと言われた後、私はここに送られました。

FWIW、csh Cシェルスクリプトで同様の問題がありました。

このコードは、入力引数をまったく取得せずに custom_command を実行できるようにしていました。

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

初めて試したときはうまくいきませんでしたが、コードのそのセクションのすべての空白をバックスペースで削除した後、「<<」と「EOF」の間のスペースを削除しました。また、最後の「EOF」を左マージンまでバックスペースしました。その後、それは機能しました:

foreach f ($forecastTimes)
    custom_command <<EOF
        arg1=x$f;2
        arg2=ya
        arg3=z,z$f
        run
        exit
EOF
end
于 2016-03-29T14:24:58.587 に答える
0

ユーザーではありませんtcshが、プログラムが実行されてからコマンドを読み取る場合は、stdinシェルリダイレクトを使用<して必要なコマンドをフィードできます。バックグラウンドで実行すると、&実行時にブロックされません。次にsleep、少しの間、持っているツール ( psgrepawkなど) を使用してプログラムの PID を検出し、それを使用killして送信します。これは-SIGTERMを実行するのと同じです。CtrlC

于 2008-10-22T00:17:44.527 に答える