PowerShell クロスプラットフォーム

bash⇔PowerShell 間で変数を共用する

シェルスクリプトとPowerShellの両方を利用していると、相互に同じ名前、同じ値の変数を共用したいことがある。

bashとPowerShellの両方で、プロファイルなどからそれぞれ同じ値を定義したファイルを読み取ればいいのだが、修正の必要が生じたときに両方のファイルを修正する必要があるうえ、修正漏れなどを考えると好ましくない。

そこで、bashとPowerShellの変数を(やや強引に)共用する方法を考えた。

シェルスクリプトをマスターデータとする

変数名と値は、シェルスクリプトに記載する。

ここでは、$HOMEにvariable.shというシェルスクリプトを置くこととする。

$HOME/variable.shの記載例

# 適当なコメント
VAR1='value1'
export VAR1

なお、このファイルはbashrcなどから.ソースで読み込むこととする。(シェル起動時に毎回実行される)

次に、これをPowerShellと共用していく。

PowerShellスクリプトの記載

PowerShellのプロファイル(パスは$PROFILEで確認できる)などに、次のように記載する。

$file = "$HOME/variable.sh"

Get-Content -Path $file | ForEach-Object {
    if ($_ -match '^[^#].{1,}=.{1,}') {
        # ^[^#]: コメント行を除外
        # .{1,}=.{1,}: xxx=xxx形式の行を取得

        # 先頭に$をつけて実行(変数代入記述のシェルスクリプトとの差異を吸収)
        Invoke-Expression "`$$_"

        # 確認用表示
        Write-Host "`$$_"

    }
}

Get-Contentで、さきほどのシェルスクリプトvariable.shの内容を1行ずつ取得し、if文で正規表現を利用しフィルタすることにより、変数に代入している行のみ拾う。

(正規表現は場合によって微調整が必要)

PowerShellにおける変数代入では、変数名先頭に$をつけるが、シェルスクリプトでは代入時は$不要である。

この違いを吸収するため、variable.shから取得した各行($_で参照できる)をInvoke-Expressionで実行する際に、先頭に$を付加している。

`$$_”としているのは、$を`でエスケープして単なる文字と認識するため。

※ “`$$_”は「’$’+”$_”」と同じ

これを、PowerShellのプロファイルなどで実行することで、PowerShellからシェルスクリプトと同じ変数(この例ではVAR1)を参照できるようになる。

プロフィール

興味のあること、つまづいたこと、考えたことなどを書いています。

カテゴリー

コメント

タイトルとURLをコピーしました