LoginSignup
5
0

More than 5 years have passed since last update.

1つのファイルにバッチ処理とシェルスクリプトを記述する

Last updated at Posted at 2018-11-18

バッチとシェルスクリプトの共存

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初めてなのでよくわからん。


  1. 少なくともWSLのUbuntu 18.04.1,dotnet 2.1.500でdotnet buildしたとき,CRLFであることを意識した記述をしなくてもエラーにならないっぽい? 

  2. ;:の場合,複雑なことをやろうとしたら,そのものがエラーの原因になってしまった 

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0