結局自作しかなかった…。
完成版は bitbucket snippet として貼り付けた。shlex.split みたいにリダイレクト・パイプの解読はしてないので、完全とは言えないけれど、アタシの目的には耐える。
完全に「文字指向」のパースなので、多分本気用途なら Cython 化するなりしないと、性能的に危ういだろうね。
パースのポイントは実際はこれだけ:
- カレット(「^」) が、Unix/C 流儀のエスケープに「似たもの」。
- 二重引用符は、始まればシンプルに相手を探すだけ。カレットの存在なんか知らない。
- アンバランスだろうが知ったことではない。二重引用符が始まったモードで閉じずに終わるのは「二重引用符に囲まれている」のとほぼ同じとみなす。
この「トンデモ」仕様こそが、「正しい cmd.exe の振る舞いのエミュレート」。要するに「厳密な処理を行う lexer/parser」を書いたり使ったり出来ない。
「二重引用符が始まったのに終わらない」ケースは、「囲まれてるのと同じ扱い」なのにも関わらず、開始の二重引用符が残る。どうしてくれるんだ、と思うのだが、ほんとこれは cmd.exe 利用者の自己責任の範疇ではあるので、悔しいけど放置するしかない。どうしようもないものこんなん。
こういうアンバランスを許して世界をダメにしたもう一つが html ね。誰も得しないんだってば、こんなん。