Powershellからbashの値を取得する。

Powershellから
bashを実行するには
下のよう「bash -c "コマンド"」という形式になる。にする。


PS C:\Users\katsu> bash -c "echo aaa"
aaa

Powershellからbashを実行して値を取得するには
したのようにすればよい。
PS C:\Users\katsu> $aaa = bash -c "echo aaa"

文字列にPowershellの変数を埋め込むと
したのように、Powershellの変数をちゃんと展開してから、
Bashに渡していることがわかる。
PS C:\Users\katsu> $str = "abcdef"
PS C:\Users\katsu> bash -c "for i in {1..3}; do echo ${str}; done"
abcdef
abcdef
abcdef

さらに
bashからの戻り値は配列として取得することができる。
(これは、wsl,bashの性質というより、Powershell1の仕様だが。)

PS C:\Users\katsu> $result = bash -c "for i in {1..3}; do echo ${str}; done"
PS C:\Users\katsu> $result[0]
abcdef
PS C:\Users\katsu> $result[1]
abcdef
PS C:\Users\katsu> $result[2]
abcdef
PS C:\Users\katsu> $result.Length
3

ただし、下のように
bash側で変数を定義して使いたいときには思ったように動かない。

PS C:\Users\katsu> bash -c "for i in {1..3}; do echo `$i; done"



これはPowershell側で変数の$(ダラー)を展開しないように、`(バッククォート)を
つけているわけだが、この`がBash側でこちらが期待したように解釈されないためだと
考えられる。
これは、`をさらにエスケープするように書くとうまく使えるようになる。

PS C:\Users\katsu> bash -c "for i in {1..3}; do echo \`$i; done"
1
2
3

この性質を用いて、bash側のコマンドをあたかも、Powershell
のコマンドのように使うことができる。

mkpasswd,dd,pasteコマンドあたりのPowershellには無いものを
Powershellから
呼び出すのに役に立つ。



コメント

人気の投稿