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 件のコメント:
コメントを投稿