アプリ版:「スタンプのみでお礼する」機能のリリースについて

〇シェルスクリプト
#!/bin/sh

mkdir 2.5
files=(`ls *.dat -1`)

#必要なファイルの振り分け
for file in ${files[@]}
do
important=`od -tu2 $file | awk 'NR==1' | awk '{print $3}'`
if [ "$important" = 455 ] ; then
cp $file 2.5
fi
done

#実行するファイルのディレクトリにて画像処理
cd 2.5
cp(cpで実行プログラムをコピー)
files=(`ls *.dat -1`)
for file in ${files[@]}
do
cp $file input.dat(実行するプログラムに対応するファイルに変更)
./cloudy_mitudo(画像処理のプログラム)

convert output.txt now.png
done

上記のプログラムを走らせたところ
./(シェルスクリプト名).sh: line 20: 19956 セグメンテーション違反です ./cloudy_mitudo
というエラーがでました。

普通に./cloudy_mitudoと実行した場合にはエラーが出ずにちゃんと画像処理が行えますが、シェルスクリプトにして実行した場合にセグメンテーション違反になってしまいます。
原因、対応策案をご教授いただきたいです。よろしくお願いします。

質問者からの補足コメント

  • つらい・・・

    回答ありがとうございます。

    ためしに実際にエラーが出ていたファイルをinput.datにcpしてプログラムを実行したのですが、問題なく実行されました。
    現に、すべてのファイルでセグメンテーション違反のエラーが出ています><

    エラーとは別件の件について
     この後にもプログラムがあって、そこでそれぞれ元のファイル名の.pngのファイルにしているので問題ありません。なお、シェルスクリプトはcloudy_mitudoに似ているプログラム(処理が少し少ない)で確認済みです。
    気遣い大変うれしいです。ありがとうございます。

    No.1の回答に寄せられた補足コメントです。 補足日時:2016/11/25 09:26

A 回答 (4件)

いまひとつわからないのですが。




(1)元々 /foo/ ディレクトリに cloudy_mitudo がある
(2) cd /foo/ 後に ./cloudy_mitudo は正常に動作する
(3)「/bar/hoge.dat を /bar/2.5/ に コピー
 cd /bar/2.5/ で移動
 /bar/2.5/ に /foo/cloudy_mitudo もコピー
 hoge.dat をinput.dat にコピー
  ./cloudy_mitudo を実行 」というシェルスクリプトで、./cloudy_mitudoがSegmentation Fault
↑以上が、質問にある状況
(4) /bar/hoge.dat を /foo/input.dat コピーして (cd /foo/ 後に) ./cloudy_mitudo は正常に動作
↑ 補足にある「ためしに実際にエラーが出ていたファイルをinput.datにcpしてプログラムを実行した」の具体的な内容

現状はこれで合ってますか?
もしそうなら、 元のディレクトリに依存する何かがあるのでしょう。
それ以上は、cloudy_mitudoのソースを見ないとわかりません。

また、現状がこれと異なるのなら、具体的に詳しく書いてください。
例えば 上記の (4) ではなく

(4') (3)の後に残ってる /bar/2.5/ ディレクトリで、 hoge.dat を nput.dat コピーしての ./cloudy_mitudo は正常に動作 ← 補足にある「ためしに実際にエラーが出ていたファイルをinput.datにcpしてプログラムを実行した」の具体的な内容

だとしたら、調べるべきものが違ってきます。



前回
> cloudy_mitudo のエラー処理を強化して、どこで発生しているか調べ、それが何故起こるか仮説を立て、仮説が正しいかを調べ、何故そうなるかを考え... と、真因に辿りつくまで地道にいくしかありません。
と書いた通りです。

サンプルプログラムでは、「エラーは起こらない」ことを前提に、エラー処理を省略しているものが多いです。
使ってる関数のマニュアルをよく読んで、エラーがあったら止めるように cloudy_mitudo を作り変えましょう。

また、処理の途中に途中経過を出力するようにして、どこでエラーになったいるか、その直前でどんなことが起こっているか確認するもの手です。
(俗にprintfデバッグと呼ばれるやつです)
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

現状としては(1)~(4)であっています。

ディレクトリに依存での間違いでした。
必要なファイルを一つ見落としていてそのためにそのファイルが読み込めなくてセグメント違反になっていました。
助かりました。ありがとうございます。

お礼日時:2016/11/25 22:07

あ, 変換間違えた.



×手で売って
〇手で打って

もちろん本当に手で打たなくても, コピペでいけるならそれでもいいです.
    • good
    • 0

ごめん, その補足の意味が分かんない.



ためしに実際にエラーが出ていたファイルをinput.datにcpしてプログラムを実行したのですが、問題なく実行されました。
現に、すべてのファイルでセグメンテーション違反のエラーが出ています><

って何を言ってるんですか? 「すべてのファイルでセグメンテーション違反のエラーが出ています」っていう状態を「問題なく実行されました」と呼ぶことは非常に珍しいと思いますよ.

ちなみにちょっと確認.
「シェルスクリプトにして実行した場合にセグメンテーション違反になってしまいます」ということは, ここにあるコマンド群を全部手で売っていった場合には「セグメンテーション違反」にはならない, ということですか?
    • good
    • 0
この回答へのお礼

日本語下手ですいません。

手で打った場合には問題なく実行されるということです。

お礼日時:2016/11/25 21:36

何かが違うとしか言いようがありません。



例えば、
fp=fopen("input.dat","r") などとしてあって、 それが成功しているかどうかを確かめずに、fp=NULLのままfreadしている
とか
特定のファイルを読んだときだけエラーになる。「普通に./cloudy_mitudoと実行した場合」はエラーにならないinput.datを読んでいる
とか。

cloudy_mitudo のエラー処理を強化して、どこで発生しているか調べ、それが何故起こるか仮説を立て、仮説が正しいかを調べ、何故そうなるかを考え... と、真因に辿りつくまで地道にいくしかありません。

例えば
cp $file input.dat(実行するプログラムに対応するファイルに変更)

cp -v $file input.dat
にすれば、どのファイルを処理したかがわかります。
いつエラーになるかもわかるはずです。



エラーとは別件で。
・convert output.txt now.png
 だと、複数.datファイルがあっても、最後の結果しかnow.pngとして残りませんが、それでいいのですか?

・入出力ファイルをプログラム中で固定するのではなく、 標準入出力を使って cloudy_mitudo < 入力 > 出力みたいにするとか、コマンドライン引数を使って cloudy_mitudo 入力 出力 みたいにすると、こんな複雑なスクリプトにしないで済みます。
この回答への補足あり
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

ためしに実際にエラーが出ていたファイルをinput.datにcpしてプログラムを実行したのですが、問題なく実行されました。
現に、すべてのファイルでセグメンテーション違反のエラーが出ています><

エラーとは別件の件について
 この後にもプログラムがあって、そこでそれぞれ元のファイル名の.pngのファイルにしているので問題ありません。なお、シェルスクリプトはcloudy_mitudoに似ているプログラム(処理が少し少ない)で確認済みです。
気遣い大変うれしいです。ありがとうございます。

お礼日時:2016/11/25 09:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!