C シェル:コマンドライン引数以外を使用してプログラムを実行するにはどうすればよいですか?
質問
私の $SHELL は tcsh です。引数を毎回変更してプログラムを何度も呼び出すCシェルスクリプトを実行したいと考えています。呼び出す必要があるプログラムは Fortran です。編集したくないです。プログラムは実行後にのみ引数を受け取りますが、コマンド ラインでは受け取りません。スクリプト内でプログラムを呼び出すと、プログラムが制御を引き継ぎます(これが私が現在行き詰まっている場所です。プログラムのプロセスが停止するまでスクリプトは何も実行しないため、決して抜け出すことができません)。この時点で、いくつかの変数を渡す必要があります。その後、数回繰り返した後、Ctrl-C を押してプログラムを終了し、スクリプトを続行する必要があります。
これはどうすればできるのでしょうか?
解決
@Toybuilder の発言に追加するには、「ヒアドキュメント」を使用できます。つまり、あなたのスクリプトには次のようなことが考えられます
./myfortranprogram << EOF
first line of input
second line of input
EOF
「」の間のすべてのもの<<EOF
" そしてその "EOF
" はプログラムの標準入力に供給されます (Fortran は標準入力から読み取るために "read (5,*)" をまだ使用していますか?)
そして、@ephemientのコメントが答えに含まれるに値すると思うからです:
さらにいくつかのヒント:<<'EOF' は ヒアドキュメント本文の補間。<<-EOF は、先頭のタブをすべて削除します ( ヒアドキュメントをインデントして一致させることができます その周囲)、EOFは 任意のトークンに置き換えられます。空のトークン (<<"")は、停止するヒアドキュメントを示します 最初の空行で。
これらがどれほど移植性があるのか、それとも単なる tcsh 拡張機能なのかはわかりません。私は <<EOF
自分で「here document」と入力します。
他のヒント
使用するのは期待です。
オーム、Fortranコードにリダイレクトを提供できますか?入力を使用して一時ファイルを作成し、stdinリダイレクト(<!> lt;)を使用してパイプすることができます。
tcsh
ユーザーではありませんが、プログラムが実行され、stdin
を介してコマンドを読み込む場合、シェルリダイレクト<
を使用して必要なコマンドをフィードできます。 &
でバックグラウンドで実行すると、実行時にブロックされません。次に、sleep
を少しの間使用し、使用しているツール(ps
、grep
、awk
など)を使用してプログラムのPIDを検出し、kill
を使用してSIGTERM
を送信しますctrl-cを実行するのと同じです。
これは、UNIXプログラムの期待どおりの仕事です。これは、プログラムを対話形式でうまくかつ簡単に指示し、プロンプトに応答することができます。
質問がこの質問の複製に近いと言われた後、ここに送られました。
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
最初に試したときはうまくいきませんでしたが、コードのその部分の空白をすべてバックスペースで削除した後、<!> quot; <!> lt; <!>の間のスペースを削除しましたlt; <!> quot;および<!> quot; EOF <!> quot;。また、閉じている<!> quot; EOF <!> quot;をバックスペースしました。左マージンまでずっと。その後、動作しました:
foreach f ($forecastTimes)
custom_command <<EOF
arg1=x$f;2
arg2=ya
arg3=z,z$f
run
exit
EOF
end