gitbash に Windows 環境変数(PATH)を通す

# 環境

* [git for windows](https://gitforwindows.org/)
* gitbash@version 4.4.23(2)-release (x86_64-pc-msys)

# 結論
`.bashrc`を以下の様に変更する
※`.git_profile`は`git for windows`が自動作成してくれる

```diff_shell:.bashrc
+ # 環境変数の設定 LINUX書式のPATHに変換
+ export PATH=`cygpath -u $PATH`
```

# 参考

https://gitforwindows.org/

https://www.msys2.org/docs/filesystem-paths/

# 備忘録のようなメモ
`Node.js`のバージョン管理`fnm`を導入したのですが、公式ページの通りに導入後、パッケージをグローバルインストールし、`gitbash`でコマンド実行するけどとどうも動かない。`cmd`では動作する。

```bash:gitbash
$ fnm --version
fnm 1.29.2

$ fnm list
* v14.19.1
* v16.14.2 default
* system

$ node -v
v16.14.2

$ npm -v
8.5.0

$ vue --version
node:internal/modules/cjs/loader:936
  throw err;
  ^

Error: Cannot find module 'C:\Program Files\Git\Users\[user]\AppData\Local\Temp\fnm
_multishells\3352_1649399178057\node_modules\@vue\cli\bin\vue.js'
?[90m    at Function.Module._resolveFilename (node:internal/modules/cjs/loader:9
33:15)?[39m
?[90m    at Function.Module._load (node:internal/modules/cjs/loader:778:27)?[39m

?[90m    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/r
un_main:77:12)?[39m
?[90m    at node:internal/main/run_main_module:17:47?[39m {
  code: ?[32m'MODULE_NOT_FOUND'?[39m,
  requireStack: []
}
```

```cmd:cmd.exe
C:\Users\[user]>vue --version
@vue/cli 5.0.4
```

`gitbash`では何故か`C:\Program Files\Git\`を見に行ってしまっている。`git for windows`のインストール先の問題かとユーザーホームディレクトリである`%HOMEPATH%`にインストールしても結果は同じ。

```bash:gitbash
$ vue --version
node:internal/modules/cjs/loader:936
  throw err;
  ^

Error: Cannot find module 'C:\Users\[user]\Git\Users\[user]\AppData\Local\Temp\fnm
_multishells\3352_1649399178057\node_modules\@vue\cli\bin\vue.js'
?[90m    at Function.Module._resolveFilename (node:internal/modules/cjs/loader:9
33:15)?[39m
?[90m    at Function.Module._load (node:internal/modules/cjs/loader:778:27)?[39m

?[90m    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/r
un_main:77:12)?[39m
?[90m    at node:internal/main/run_main_module:17:47?[39m {
  code: ?[32m'MODULE_NOT_FOUND'?[39m,
  requireStack: []
}
```
一通りインターネットの海を調べてみたが、どうも同様の事象自体が表立ってないみたい。諦めようかな。

最後の悪あがき程度に、開発者よろしく`vue`のデバッグを試みる。
まずは、`fnm`がどの`node`モジュールを使っているか探す。`fnm env`で大体わかる。

```bash:gitbash
$ fnm env
export PATH="C:\\Users\\[user]\\AppData\\Local\\Temp\\fnm_multishells\\75112_1649
400296857":$PATH
export FNM_MULTISHELL_PATH="C:\\Users\\[user]\\AppData\\Local\\Temp\\fnm_multishe
lls\\75112_1649400296857"
export FNM_VERSION_FILE_STRATEGY="local"
export FNM_DIR="C:\\Users\\[user]\\AppData\\Roaming\\fnm"
export FNM_LOGLEVEL="info"
export FNM_NODE_DIST_MIRROR="https://nodejs.org/dist"
export FNM_ARCH="x64"
```

`FNM_MULTISHELL_PATH`が示すディレクトリ`C:\\Users\\[user]\\AppData\\Local\\Temp\\fnm_multishells\\75112_1649400296857`内に`vue`があるか探す。ビンゴ。

```shell:C:\\Users\\[user]\\AppData\\Local\\Temp\\fnm_multishells\\75112_1649400296857\\vue
#!/bin/sh
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")

case `uname` in
    *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
esac

if [ -x "$basedir/node" ]; then
  exec "$basedir/node"  "$basedir/node_modules/@vue/cli/bin/vue.js" "$@"
else 
  exec node  "$basedir/node_modules/@vue/cli/bin/vue.js" "$@"
fi

```

ぱっと見で変数`basedir`が変な値を参照しているのは明確なので、参照元であろう`$0`の値をコンソールに出力。

```diff_shell:vue
#!/bin/sh
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")

+ echo $0

case `uname` in
    *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
esac

if [ -x "$basedir/node" ]; then
  exec "$basedir/node"  "$basedir/node_modules/@vue/cli/bin/vue.js" "$@"
else 
  exec node  "$basedir/node_modules/@vue/cli/bin/vue.js" "$@"
fi
```
`vue --version`を実行
```bash:gitbash
$ vue --version
\Users\[user]\AppData\Local\Temp\fnm_multishells\75112_1649400296857/vue
node:internal/modules/cjs/loader:936
  throw err;
  ^
```
`\Users\[user]\AppData`、相対パスみたいなパスでコマンドが実行されている。`c:\`が無い。shell script自体、Windows上で実行される事を想定してないだろうからそりゃそうなるわなぁ（諦めモード

では次に、このWindows書式のパスであろう`$0`を`cygpath -w [path]`でWindows書式に使用としている。意味なくね？デバッグ。

```diff_shell:vue
#!/bin/sh
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")

+ echo $0

case `uname` in
    *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
esac

+ echo $basedir

if [ -x "$basedir/node" ]; then
  exec "$basedir/node"  "$basedir/node_modules/@vue/cli/bin/vue.js" "$@"
else 
  exec node  "$basedir/node_modules/@vue/cli/bin/vue.js" "$@"
fi
```
`vue --version`を実行
```bash:gitbash
$ vue --version
\Users\[user]\AppData\Local\Temp\fnm_multishells\75112_1649400296857/vue
C:\Program Files\Git\Users\[user]\AppData\Local\Temp\fnm_multishells\75112_1649400296857
node:internal/modules/cjs/loader:936
  throw err;
  ^
```
`C:\Program Files\Git\Users\[user]\AppData`。見たことあるパスがでてきた。

`shell script`は門外漢で詳しく無いので、推測でしかないが、`uname`がユーザーエージェントであると仮定して、該当のscriptは「ユーザーエージェントに`*CYGWIN*|*MINGW*|*MSYS*`が含まれる時、Windows上でエミュレート実行されていると想定し、UNIX書式→Windows書式に変換する」と読める。
では、コマンド実行される際のパスがUNIX書式になれば良いのではないか。と更に仮定してみる。さぁ、どこで指定されているのか。`frm env`だ。`frm env` はshellを吐き出すが、そのパスがWindows書式のパスだった。それをUNIX書式に変えてやれば良いのではないか。

```bash:gitbash
$ fnm env
export PATH="C:\\Users\\[user]\\AppData\\Local\\Temp\\fnm_multishells\\75112_1649
400296857":$PATH
export FNM_MULTISHELL_PATH="C:\\Users\\[user]\\AppData\\Local\\Temp\\fnm_multishe
lls\\75112_1649400296857"
export FNM_VERSION_FILE_STRATEGY="local"
export FNM_DIR="C:\\Users\\[user]\\AppData\\Roaming\\fnm"
export FNM_LOGLEVEL="info"
export FNM_NODE_DIST_MIRROR="https://nodejs.org/dist"
export FNM_ARCH="x64"
```

`frm env`を実行されると、環境変数`$PATH`には、Windows書式とUNIX書式のパスが混在している。

```diff_shell:.bashrc
eval "$(fnm env --use-on-cd)"
```
```bash:gitbash
$ echo $PATH
C:\Users\[user]\AppData\Local\Temp\fnm_multishells\75112_1649400296857:/c/Users/
[users]/bin:/mingw64/bin:/usr/local/bin:/usr/bin:/usr/bin:/mingw64/bin:/usr/bin:/c/
Users/[users]/bin:/c/Program Files (x86)/Intel/iCLS Client:/c/Program Files/Intel/
iCLS Client:/c/WINDOWS/system32:/c/WINDOWS:/c/WINDOWS/System32/Wbem:/c/WINDOWS/S
ystem32/WindowsPowerShell/v1.0:/c/Program Files (x86)/Intel/Intel(R) Management
Engine Components/DAL:/c/Program Files/Intel/Intel(R) Management Engine Componen
ts/DAL:/c/Program Files (x86)/Intel/Intel(R) Management Engine Components/IPT:/c
/Program Files/Intel/Intel(R) Management Engine Components/IPT:/c/Program Files/
Intel/WiFi/bin:/c/Program Files/Common Files/Intel/WirelessCommon:/c/WINDOWS/Sys
tem32/OpenSSH:/c/Program Files/Microsoft SQL Server/Client SDK/ODBC/110/Tools/Bi
nn:/c/Program Files (x86)/Microsoft SQL Server/120/Tools/Binn:/c/Program Files/M
icrosoft SQL Server/120/Tools/Binn:/c/Program Files/Microsoft SQL Server/120/DTS
/Binn:/c/Program Files (x86)/Microsoft SQL Server/120/Tools/Binn/ManagementStudi
o:/c/Program Files (x86)/Microsoft SQL Server/120/DTS/Binn:/c/Program Files (x86
)/Google/Cloud SDK/google-cloud-sdk/bin:/c/Program Files/Microsoft VS Code/bin:/
c/java/jdk-15.0.1/bin:/c/ProgramData/chocolatey/bin:/c/Program Files (x86)/Power
Shell/7:/cmd:/c/Users/[users]/AppData/Local/Microsoft/WindowsApps:/c/Users/[users]/A
ppData/Local/GitHubDesktop/bin:/c/Users/[users]/AppData/Local/Microsoft/WindowsApp
s:/usr/bin/vendor_perl:/usr/bin/core_perl
```
じゃぁ、Windows書式→UNIX書式に変えてみる。
```diff_shell:.bashrc
eval "$(fnm env --use-on-cd)"

+ # Convert and set Windows environment variables to LINUX-style PATH.
+ export PATH=`cygpath -u $PATH`
```
```bash:gitbash
$ echo $PATH
/tmp/fnm_multishells/75112_1649400296857:/c/Users/[user]/bin:/mingw64/bin:/usr/loc
al/bin:/usr/bin:/usr/bin:/mingw64/bin:/usr/bin:/c/Users/[user]/bin:/c/Program Fil
es (x86)/Intel/iCLS Client:/c/Program Files/Intel/iCLS Client:/c/WINDOWS/system3
2:/c/WINDOWS:/c/WINDOWS/System32/Wbem:/c/WINDOWS/System32/WindowsPowerShell/v1.0
:/c/Program Files (x86)/Intel/Intel(R) Management Engine Components/DAL:/c/Progr
am Files/Intel/Intel(R) Management Engine Components/DAL:/c/Program Files (x86)/
Intel/Intel(R) Management Engine Components/IPT:/c/Program Files/Intel/Intel(R)
Management Engine Components/IPT:/c/Program Files/Intel/WiFi/bin:/c/Program File
s/Common Files/Intel/WirelessCommon:/c/WINDOWS/System32/OpenSSH:/c/Program Files
/Microsoft SQL Server/Client SDK/ODBC/110/Tools/Binn:/c/Program Files (x86)/Micr
osoft SQL Server/120/Tools/Binn:/c/Program Files/Microsoft SQL Server/120/Tools/
Binn:/c/Program Files/Microsoft SQL Server/120/DTS/Binn:/c/Program Files (x86)/M
icrosoft SQL Server/120/Tools/Binn/ManagementStudio:/c/Program Files (x86)/Micro
soft SQL Server/120/DTS/Binn:/c/Program Files (x86)/Google/Cloud SDK/google-clou
d-sdk/bin:/c/Program Files/Microsoft VS Code/bin:/c/java/jdk-15.0.1/bin:/c/Progr
amData/chocolatey/bin:/c/Program Files (x86)/PowerShell/7:/cmd:/c/Users/[user]/Ap
pData/Local/Microsoft/WindowsApps:/c/Users/[user]/AppData/Local/GitHubDesktop/bin
:/c/Users/[user]/AppData/Local/Microsoft/WindowsApps:/usr/bin/vendor_perl:/usr/bi
n/core_perl
```
`C:\Users\[user]\AppData\Local\Temp\fnm_multishells\75112_1649400296857`
↓
`/tmp/fnm_multishells/75112_1649400296857`

おお・・・。ぽい。。。
```bash:gitbash
$ vue --version
/tmp/fnm_multishells/75112_1649400296857/vue
C:\Users\[user]\AppData\Local\Temp\fnm_multishells\75112_1649400296857
@vue/cli 5.0.4
```
おお・・・。綺麗に変換された。うえに動いた。

スッキリ

了