シェルスクリプトでC言語プログラムのscanfへの入力を自動化した話
毎度おなじみ、この記事にあることを実践してなんか損害出ても当方は責任を取りません。自己責任で
なんとかコンセント確保出来たので書いてこうと思う。この前TexLiveにjlistingパッケージを導入した話書いたけど、そん時の課題の中にいくつもある画像ファイルを読み込んで特定条件のものを探しだせみたいなやつだったのよ。そん時教授の作ったヘッダーファイルを使ってって感じだったんだけどそれが画像読み出し&書き出しの関数でその関数の中にscanfが含まれてたわけさ。その関数を元に新しく関数作っても良かったんだけどなんかそれやったら負けな感じしてどうせならシェルスクリプトでscanf自動化してやろう。ってなわけで本編。
環境はいつもどおりUbuntu16.04LTS64bitで。
いろいろ探してみたらbashのヒアドキュメントってのが出てきた。
簡潔に書く。実行するオブジェクトファイルをa.outとし、その中には2個のscanfがあるものとする。そしてひとつ目のscanfはインポートファイル名(input.pbm)、ふたつ目は出力ファイル名(output.pbm)とする。
#!/bin/bash
./a.out << EOF
input.pbm
output.pbm
EOF
ちゃんと理解してないけどこんなイメージってことで読んでください。多分詳しい人からしたらツッコミどころ満載の文だから。
そもそもヒアドキュメントってのは複数行の文字列を簡潔に記述するための機能らしいんだけどそれつかって
"<<"が./a.outの実行中に入力されますよ的な感じにして
EOFからEOFで囲まれた箇所を文字列とする。
それがいい感じにscanfに入ってくれる的な。
だからscanfの数とEOF間の行数があってないとうまく動かない。
あとEOFは別に何でも良い。ここからここってのを決めるためのキーワード代わりだから。
ごめんなさい、書いててなんも理解してないことが目に見えて悲しくなったわ。まぁ備忘録代わりということでここはひとつ。
ちなみに大学の課題の方はこれをfor文でまわしてってかんじでEND。
理解できるようになったらちゃんと追記しますんでよろしくお願いします。