バッチとシェルスクリプトの共存
MSBuildのビルドイベントを書いていた時に,WindowsでもLinuxでもビルドイベントが動作してほしかったので考えた。
: <<END_OF_BATCH
@ECHO OFF
REM batch file
ECHO BATCH FILE !!
EXIT /B
REM end of batch
END_OF_BATCH
#
# shell script
echo "SHELL SCRIPT!!" #
#
# end of shell script
#
上のようなコードを改行コードLFで保存する。コマンドプロンプトで実行すると BATCH FILE !!
,シェルで実行すると SHELL SCRIPT!!
と表示される。
解説
カギを握るのは1行目の :
である。バッチファイルではラベルの定義が行われ,シェルでは終了コード0を返すコマンドが実行される。
ヒアドキュメント<<
を用いて,シェルでのみ,END_OF_BATCH
までをコマンドとして読まないようにして,バッチファイルとして実行したときにだけ実行されるようにしている。
バッチファイルの内容の最後でEXIT /B
を行い,END_OF_BATCH
でヒアドキュメントを終了している。
Visual Studio のビルドイベントの設定からは,改行コードをLFにできないため,コマンドあるいは引数の末尾にCRが付け加えられてしまい,エラーの原因になる? 1
行末に 2;:
(セミコロン コロン スペース) を挿入することでエラーを回避できる。(空行は :
(コロン スペース))
行末に #
(スペース ナンバー) を挿入することでエラーの回避ができる。(空行は#
(ナンバー))
思ったこと
日本語を含めるとどうあがいても苦しかった。つらい。 → 部分的にShift-JISとUTF-8を組み合わせれば,表示できなくもない。
コマンドプロンプトが#をコメントとして扱ってくれさえすれば,shebangを書けるのに。
Qiita初めてなのでよくわからん。