bat,sh,csh,ant,make注意点・メモ
個人的メモです。すいません、何度もつまづく個人的注意点を並べただけで、まだ分かりやすい記述に
していません。
Windows/UNIX両方で動くモノを作成する場合、BATやシェルの癖や
ファイルの文字コードなどで、つまらない時間を取られがち
です。
B-shell雛形
#!/bin/bash # UTF-8 LF # このスクリプトを置いてあるフォルダ THIS_DIR=$(cd $(dirname ${BASH_SOURCE:-$0}); pwd) # 引数個数チェック if [ $# -le 3 ]; then echo "引数が足りません";exit 0;fi # 動作継続の問い合わせ read -p "処理しますか? (y/n) " ans if [ $ans != "y" ];then echo "bye!";exit 0;fi # 他コマンド実行と結果チェック git xxxx if [ $? -ne 0 ]; then echo " SOME ERROR OCCURED ";exit 1; fi echo done exit 0
BATの注意点
BATで複雑な作業を行うのは現実的ではない。
ANTなどを用いBATはantの起動とステータスチェックのみ
といった形にすべき。
- 他を呼んだ後のステータスチェックはerrorlevelを見る
call ant if errorlevel 1 goto ERR type kekka.txt goto END :ERR echo =========== SOME ERROR OCCURED ========== :END pause
- 他BAT呼び出しはCALLで
ANTなどもBATなのでCALL ANTとするcall ant clean
- COPYには文字列ファイルであっても必ず/Bを付ける
/Bを付けずにCOPYを行うとUTF-8ファイルなどでは一部文字が化けるcopy html_1.txt/B+kekka.txt/B+html_2.txt/B sample.html/B
B-shellの注意点
空白文字、とにかく空白文字に注意!!!!
- 改行がLFであること
CR/LFになっていると、Commande not found というおバカなメッセージが出る。% AA10_test.sh AA10_test.sh: Command not found. ちゃんとAA10_test.shは存在し、実行フラグも付いており、中の記述も 問題はない。ただ改行がCR/LFになっているだけ
信じられないことに、これはB-shellのバグではなく 仕様。
- 他を読んだ後のステータスチェックは$?を見る。
java -classpath .:../../symphonie.jar MyClass 1> kekka.txt 2> err.txt if [ "$?" = "0" ] ; then 。。。 else 。。。 fi
- 標準出力と標準エラーを画面に出しながらファイルに落とすには
コマンド 2>&1 | tee log.txt
と書く。
- 状態チェックは引用符で囲む必要がある
if [ "$?" = "0" ] ; then
- 記号の前後には空白が必要!!!
これは最悪の仕様で、多くの人が繰り返し 失敗する。if[ "$?" = "0"] ; then --- "0"と]の間に空白が無いと AA10_test.sh: line 3: syntax error near unexpected token `then' AA10_test.sh: line 3: `if[ "$?" = "0"] ; then'
信じられないことに、これはB-shellのバグではなく 仕様。
- ifの終わりはfi
「その場での軽い冗談で作った仕様も広く使われることが あるのでこんなふざけたものにしてはならない」という 戒め。if [ "$?" = "0" ] ; then 。。。 else 。。。 fi
- ファイルの最後は"#"だけの行を置く
コマンドの後ろに改行がないとまともに動かないので、ファイルの 最後に"#"のだけの行を置き、間違いを避けること。。。。 #
信じられないことに、これはB-shellのバグではなく 仕様。
C-shellの注意点
残念ながらcshが実装されていない環境もある。
残念ながらMakefileではB-shellの使用が標準となっている。
- 他を読んだ後のステータスチェックは$statusを見る。
(java -classpath .:../../symphonie.jar MyClass > kekka.txt)|& tee err.txt if( $status == 0 )then echo "==== DONE ====" else echo "==== SOME ERROR OCCURED ====" endif
- 標準出力と標準エラーを保存仕分けるには括弧を使う。
(java -classpath .:../../symphonie.jar MyClass > kekka.txt)|& > err.txt
Makeの注意点
タブ。それに尽きる
ANTの注意点
-
propertyは先に出たもの勝ち。
importしたファイルでpropertyがセットされていると、import後に 書き換えることはできない。<import file="../properties.xml"/> <!-- dirが定義されているとして --> <property name="dir" value="./AAA"/>
当然、定義済みのものを参照して定義を置き換えることはできない。<import file="../properties.xml"/> <property name="dir" value="${dir}/../AAA"/>
-
基本的に相対ディレクトリを用いて柔軟なディレクトリ
構成をとることはあきらめた方が良い。理由は色々。
-
zipで実行モード付きとするには次のように指定。
<zip destfile="./SAMPLEs.zip"> <zipfileset dir="./SAMPLEs" prefix="SAMPLEs" excludes="**/*.csh,**/*.sh" /> <zipfileset dir="./SAMPLEs" prefix="SAMPLEs" includes="**/*.csh,**/*.sh" filemode="775"/>
| 固定リンク