WindowsでHere-docを使ってみる。

Here-docもしくはヒアドキュメントというのは、文字列をシェルスクリプトやプログラムコード中に埋め込む方法の一つです。

UNIX系のシェルである sh (Linux系ではbashへのシンボリックリンクであることが多い)では、たとえば
$ cat << _EOT_
> hello, world.
> _EOT_
hello, world.
$
などというように、 _EOT_ で囲まれたものをコマンドへの標準入力に食わせるために使います。_EOT_ は前後で同じものを使えばいいので、食わせたいテキスト中に同じものがなければなんでも可能です。ちなみに EOT は "End of Text" の意味で、慣用句としてよく使われます。
同じことはPythonでもできます。
$ python - << _EOT_
print('hello, world')
_EOT_
hello, world
$
この場合には _EOT_ で囲まれた部分をスクリプトとして Python に食わせています。
この手法を使えば、ひとつのシェルスクリプトの中にPythonのスクリプトを埋め込むことで、スクリプトファイルを一つにまとめることができます。

とここまでを踏まえて。

これをWindowsで使えないかと思ったのがここでの趣旨。バッチファイル内にpythonスクリプトを埋め込めば、いくつもファイル作らなくて済むじゃん、というお話です。可読性は落ちますが…。

まず cmd.exe では、調べてみたけれどHere-docは使えないようです。()を使うというトリッキーな方法がありますが、これはちょっと筋が違うので却下です。stackOverflowにも heredoc for Windows batch? というような記事がありますが、ちょっと一筋縄ではいかないようです。他にも How to use “<<” in batch file or command prompt? というトピックがsuperuser.comにあります。

次に Windows PowerShell では、@' と '@ (および @" と "@)で囲んだ部分を here stringsヒア文字列)という形で利用できるようです。ちょっとPythonに食わせられるかどうかを試してみます。

PS C:\Users\kats> python - @'
>> print('hello, world')
>> '@
Python 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 23:09:28) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> ^Z

PS C:\Users\kats> @'
>> print('hello, world')
>> '@ | python -
hello, world
PS C:\Users\kats>

見て分かる通り、Pythonにうまく食わせるには、冒頭に 'python -' ではなくて、パイプで '|python -' してやればいいようです。ちなみにダブルクォーテーションを使うと変数の展開が行われるようです。

さらに Nyagos を見てみると、Support Here Document #130を参照する限り、残念ながらHere-docはまだ組み込まれていないようです。

なので、Windows環境でHere-docを使うには、WSLやCygwinを除けば今のところ Windows PowerShell に頼るしかないようです。

…でもWPSはよくわからない…(というかわかろうとしていない)。

0 件のコメント:

コメントを投稿

WesternDigitalこわれた。

たぶん寿命を過ぎてるのでクレームとまではいかないのだけれど。 WesternDigitalのWD60EFRXが壊れました。モノは2014年11月に購入。ところが3年で壊れ、RMAにより2017年11月に交換したものです。BlackBlazeでも故障率がそれなりに高かったので、そう...