shell
PowerShell

shellとpowershellでファイルをやり取りする

経緯

powershellで完璧で幸福でとても楽しい自動処理をゴキゲンに書いていました。
そこでgit log ${CommitHash}...HEADとしたときのことです。

なんということでしょう。
この不完全なgit logというプログラムはpowershell様の前で文字化けしやがったのです。
いろいろ試したのですがまぁ無理だったのでしょうがないのでpowershell様からshを起動することにしました。

git for windowsをインストールしていれば懐の深いpowershell様はshの起動を許してくれます。
ですが、そこでもいくつかの問題が出てきたので、それをshの為に解消してあげたのが今日のお話。

powershell -> sh

${CommitHash}の部分を受け渡す必要があったので、shファイルを自動生成します。-cオプションはなんかうまくいかなかったのでファイルで渡すことに。

しかしpowershell様の書き上げるテキストはBOM付きのUTF-8です。
これをshに読ませるとなぜかshはbinaryだから読めませーんとふざけたことを言い出します。

しょうがないので
echo "git log ${CommitHash}...HEAD > commit.log" | Out-File "コマンド.sh" -Encoding ascii
とかでわざわざBOMを取り除いてshに食わせます。

sh -> powershell

今度は無事git logが吐き出されたのでpowershell様に読み上げていただきます。
が、このgit log無作法にもBOMなしのUTF-8とかいうものを吐き出します。

当たり前ですがUTF-8はBOMが付いていないといけません。
しかし、まぁ、懐の深いpowershell様はちゃんと
$log = Get-Content -Encoding UTF8 commit.log
でBOMなしUTF-8も読んであげることができるのです。

なんてすばらしいんでしょう。