我在尝试使用时遇到了同样的问题来自 WSL 的适用于 Windows 的 Docker.
有大量现有的 shell 脚本在 Linux 下运行良好,并且大多数在 WSL 下也运行良好,直到由于以下原因失败docker: command not found
。处处改变docker
to docker.exe
会太麻烦而且不便携。
尝试过解决方法aliases in ~/.bashrc
as here首先:
shopt -s expand_aliases
alias docker=docker.exe
alias docker-compose=docker-compose.exe
但它要求每个脚本都运行在交互模式还是在反引号内不起作用无需修改脚本。
然后尝试了exported bash 功能 in ~/.bashrc
:
docker() { docker.exe "$@"; }
export -f docker
docker-compose() { docker-compose.exe "$@"; }
export -f docker-compose
这有效。但添加每个需要的 exe 仍然太乏味。
最终以更容易的方式结束symlinks方法和修改后的wslshim自定义帮助程序脚本。
只需添加一次即可~/.local/bin/wslshim
:
#!/bin/bash -x
cd ~/.local/bin && ln -s "`which $1.exe`" "$1" || ln -s "`which $1.ps1`" "$1" || ln -s "`which $1.cmd`" "$1" || ln -s "`which $1.bat`" "$1"
使其可执行:chmod +x ~/.local/bin/wslshim
然后添加任何“别名”就像输入两个单词一样简单:
$ wslshim docker
+ cd ~/.local/bin
++ which docker.exe
+ ln -s '/mnt/c/Program Files/Docker/Docker/resources/bin/docker.exe' docker
$ wslshim winrm
+ cd ~/.local/bin
++ which winrm.exe
+ ln -s '' winrm
ln: failed to create symbolic link 'winrm' -> '': No such file or directory
++ which winrm.ps1
+ ln -s '' winrm
ln: failed to create symbolic link 'winrm' -> '': No such file or directory
++ which winrm.cmd
+ ln -s /mnt/c/Windows/System32/winrm.cmd winrm
脚本自动选取一个绝对路径到 $PATH 中的任何 Windows 可执行文件并将其符号链接,而不扩展为~/.local/bin它也驻留在 WSL 上的 $PATH 中。
如果需要,可以轻松地进一步扩展此方法以自动链接给定目录中的任何 exe。但链接整个 $PATH 就有点矫枉过正了。 )