zxというのがございます。こちらの記事で詳しく紹介されています。
google謹製の、Javascriptでシェルを扱えるやつです。
これってwindowsに入れたらcmdが扱えてbatファイルとおさらばできるのか?いやいや、そんなわけないよなあ、と調べてみるも、ググラビリティの問題なのか、単に使ってる人がいないのか、あんまり(日本語の)情報が多くない気がする。
なればと、物は試しでやってみました。
(追記)cmdを扱う方法
コメントで教えていただきました。ありがとうございます!
以下の設定をすることでcmdが扱えるようになります(筆者はzx@8.0.2/Windows11Homeで確認)
$.shell = 'cmd.exe';
$.prefix = '';
$.verbose = false
当然ながら日本語を扱う場合はchcp 65001
が必要です。気が向いたら別記事を立てます。
実験
とりあえずpowershellで作業してみます。npmでzxをグローバルインストールすると、すんなり入りました。
npm i -g zx
実行用のjsファイルを作ります。
await $`ここにコマンド`
という書き方でシェルが実行できます。jsのテンプレートリテラルなので、変数を埋め込むと自動でエスケープしてくれたりしてべんり。
拡張子を.mjs
にするとトップレベルでawait
が使えます。
await $`echo hello, zx!`
実行してみましょう。
zx test.mjs
以下、$
はzxから走らせたコマンドです。
$ echo hello, zx!
hello, zx!
お、いけたいけた。ついでにもういっちょ。
$ ipconfig
/bin/bash: ipconfig: command not found
Error: /bin/bash: ipconfig: command not found
at file:///C:/Users/<ユーザー名>/Desktop/zx/test.mjs:4:8
exit code: 127 (Command not found)
さすがにcmdが扱えるなんてことはなくて、bashで動いてるんですね。
……いや、なんで?
WSLで動いてる?
なんでwindowsでbashが動いてるんだ?と思って、いろいろ試しました。
$ pwd
/mnt/c/Users/<ユーザー名>/Desktop/zx
/mntって、確かwslからwindowsを見るときのパスだったよな。WSLで動いてるのか?
試しに、wslに無いコマンドを打ってみて・・・
$ convert -size 100x100 xc:white test.png
Error: /bin/bash: convert: command not found
wslにconvertを入れて・・・
apt install imagemagick
もう一回打つと・・・?
$ convert -size 100x100 xc:white test.png
$ ls
basic1.png
test.mjs
なるほど。理屈はわからないけど、WSLで動いてるみたいです・・・。zxが中でなんかやっているのでしょう。
たぶんどっかには仕様が書いてあると思うんだけど、めんどくさいので調べるのはやめた。
誰か、なぜWSLで動くのか、教えてください。
WSLをインストールしてないマシンでやるとどうなるんだろう?