23723


現在はテキストをバイナリーファイルに変換するというプログラムはあるので、考え方として一度.pyファイルの実行結果をtxtファイルに入れ、txtファイルをバイナリーファイルに変換する。

[code]

    for file in `\find . -maxdepth 1 -type f`; do
      ./$file > a.txt
      cat a.txt |txt2bin.py -i ${file%.*}
      rm a.txt
    done
    
[/code]

しかし${file%.*}があってないのか、バイナリーファイルが生成しません。  
実行ファイルの名前を使って新しいファイルを作る方法を教えていただけないでしょうか。

* * *

mjyさんが提案したset -xで確認したところ、例えばmmat.pyのとき、

[code]

    + cat a.txt
    + txt2bin.py -i ./mmat
    
[/code]

と、ファイル名が./ついていることが気づきました。

なのでコードを以下のように書き換えました。

[code]

    for file in `\find . -maxdepth 1 -name "*.py"`; do
      ./$file > a.txt
      str=${file%.*}
      str2=${str##*/}
      cat a.txt |txt2bin.py -i $str2
      rm a.txt
    done
    
[/code]

実行した結果、表示では

[code]

    + for file in `\find . -maxdepth 1 -name "*.py"`; do
    + ././mmat.py
    + str=./mmat
    + str2=mmat
    + cat a.txt
    + txt2bin.py -i mmat
    + rm a.txt
    
[/code]

となり、一見問題ない感じだったが、フォルダのなかにはバイナリファイルはまた生成できなかった。

$str2のような書き方をすると名前と認識しないのでしょうか？何か解決方をお願いいたします。


CC BY-SA 3.0
2016-04-04T02:45:19.813
23719
2016-04-04T06:14:19.467
2016-04-04T06:14:19.467
13580
13580
question
shellscript
シェルスクリプトで実行ファイルと同じ名前のバイナリーファイルを生成する方法


まず、txt2bin.py の挙動を確認して下さい。

[code]

    # out.bin が生成されるか
    echo "hello" |txt2bin.py -i out.bin
    
[/code]

問題なければループの挙動を確認。

[code]

    # set -xでもいいですが
    # ループで何が実行されているか確認
    for file in `\find . -maxdepth 1 -type f`; do
        echo "./$file > a.txt"
        echo "cat a.txt |txt2bin.py -i ${file%.*}"
        echo "rm a.txt"
    done
    
[/code]

これも問題なければ実行ファイルの出力を見てみる。

[code]

    for file in `\find . -maxdepth 1 -type f`; do
        ./$file > a.txt
        # バイナリだと端末が乱れるので cat に -v を付けて(ついでに行番号も付けて)確認
        cat -nv a.txt
    done
    
[/code]

こんな感じでだいたい分かると思います。


CC BY-SA 3.0
2016-04-04T04:45:21.970
23723
2016-04-04T04:45:21.970
3054
23719
answer