質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Q&A

解決済

1回答

283閲覧

各フォルダに配置したプログラムを実行

anpapa

総合スコア16

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

0グッド

0クリップ

投稿2017/10/26 08:09

編集2017/10/27 05:14

OSはCentOS Linux release 7.3.1611です。

失礼な表現等ございましたら、申し訳ございません。
また、説明がわかりにくい所など御座いましたらお申し付けください。

以下の様な構造の各フォルダの中に"test.c"があり、c言語で書かれたソースファイルが各フォルダに入っており、それぞれをコンパイルし、それぞれ実行し、それぞれのフォルダに結果を格納しようと思っています。
以前は、screenというコマンドを用いて、フォルダの数だけ仮想端末を作成し、それぞれの仮想端末に、コマンドを飛ばして実行していました。
しかし、私事のため、screenコマンドを使うことができなくなりました。
ですので、もしよろしければ何か解決策等ございましたら、教えていただけないでしょうか。
よろしくお願いいたします。

├── a350 │   ├── b100 │   │   └── test.c │   └── b110 │   └── test.c ├── a400 │   ├── b100 │   │   └── test.c │   └── b110 │   └── test.c ├── a425 │   ├── b100 │   │   └── test.c │   └── b110 │   └── test.c ├── a475 │   ├── b100 │   │   └── test.c │   └── b110 │   └── test.c └── a500 ├── b100 │   └── test.c └── b110 └── test.c

findを用いれば良いと、dodox86さんからアドバイスをいただきましたので、a350a500と同じディレクトリにdo_process.shを配置し、a350a500と同じディレクトリで以下の様に試したところ、**

sh

1find ./ -type f -name "test.c" -exec ./do_process.sh {} \;

find: ./do_process.sh :No such file or directory
とエラーが出てしまいました。対策として、各フォルダにもdo_process.shを配置してみましたが結果は同じでした。どのディレクトリにdo_process.shを配置すればよろしいでしょうか。

自己解決いたしました。シバングを環境に合わせてあげる必要があるようでしたので、変更したところ無事動きました。続いて、頂いたシェルスクリプトをコンパイルして実行する様に変更したいと思います。

追記
方法はわかったのですが、肝心のc言語で書かれたソースコードをコンパイルするシェルスクリプトを、頂いたシェルスクリプトを元に自作してみましたが、なかなかうまくいきませんでした。こちらで質問しようかと思いましたが、こちらでは方法そのものを聞いているので、質問の趣旨から外れている気がするので一旦、ベストアンサーを選び質問を閉じさせていただきます。回答してくださった皆様、どうもありがとうございました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

PineMatsu

2017/10/26 08:17

Linuxだとは思うのですがOS等の明記をお願いします。
cateye

2017/10/26 08:37 編集

"test.c"はソースファイルだと思うのですが、実行ファイルですか? また、同時に実行するのでしょうか?
anpapa

2017/10/27 03:24

> PineMatsuさん OSはCentOS Linux release 7.3.1611 となっています。本文にも追記しました。ご指摘どうもありがとうございます。
anpapa

2017/10/27 03:31

> cateyeさん ソースファイルです。c言語で書かれたソースファイルが各フォルダに入っており、それぞれをコンパイルし、実行し、それぞれのフォルダに結果を格納する、というのが私が望む処理です。同時に実行についてですが、同時に実行できる分だけ実行したいです。こちらで、質問の回答になっていますでしょうか?
guest

回答1

0

ベストアンサー

「test.c」と言う名前の実行形式のファイルがあると考えてよろしいでしょうか?
(test.c とあると、C言語のソースファイルかと思ってしまったもので)

その前提ですと、下のようなbashスクリプトをひとつ作って、findコマンドで"test.c"を検索し、個別に実行させてしまえば良いと思います。

Bash

1#!/usr/bin/bash 2# do_process.sh 3 4# 引数チェック 5if [ $# -eq 0 ]; then 6 echo "No argument(s)" 7 exit 1 8fi 9 10# 第1引数指定のファイルが実行可能かチェック 11if [ ! -x $1 ]; then 12 echo "$1 is not executable." 13 exit 1 14fi 15 16PGM=$1 17 18# フルPATHに".log"を付けてログファイル名とする。 19LOGFILE=${PGM}.log 20 21# ログファイルへ実行結果を出力 22$PGM > $LOGFILE 23

上記のbashスクリプトをfindコマンドに食わせます。

Bash

1$ find ./ -type f -name "test.c" -exec ./do_process.sh {} \;

find コマンドの詳細はman find 等でコマンドリファレンスをご覧いただきたいですが、上記の例では

find [検索開始位置のPATH] -type f -name "test.c" -exec [do_process.shのPATH] {} ;

としています。do_process.sh の第1引数にtest.c のフルPATHを指定し、do_process.sh 内でそれを
実行し、出力結果をログファイルにリダイレクトします。

投稿2017/10/26 10:16

dodox86

総合スコア9183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

anpapa

2017/10/27 03:47

すみません、「test.c」というc言語のソースファイルが各フォルダに入っておりまして、各フォルダに入っている「test.c」をコンパイルし、そしてそれぞれのフォルダに出てきた「a.out」を実行したい、というのが私の望む処理です。情報不足で申し訳ありません。 このように「find」を用いて、できることは知りませんでした。ありがとうございます
dodox86

2017/10/27 03:52

test.c をコンパイルしてa.outを実行したいと言うのであれば、例示したbashスクリプトであるdo_process.sh を修正してその中でコンパイル〜a.out を実行するようにすれば使えるはずですのでどうぞ。
anpapa

2017/10/27 03:55

早速回答いただきどうもありがとうございます。先ほど、自分で試していたのですが、直接findを用いてコンパイルしようとしていました。シェルスクリプトの中身をその様にしてみます。どうもありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問