【问题标题】:Bash on Windows - alias for exe filesWindows 上的 Bash - exe 文件的别名
【发布时间】:2017-12-24 09:39:06
【问题描述】:

我在 Windows 上使用 Ubuntu 上的 Bash,这是在 Windows 10 上运行 bash 的方式。我安装了 Creators 更新并且 Ubuntu 版本是 16.04。

我最近在玩 npm、node.js 和 Docker 之类的东西,对于 docker,我发现可以安装它并在 Windows 中运行它,只需使用 bash 的客户端部分,直接调用 docker.exe 文件Windows 的 Program Files 文件夹。我只是更新我的路径变量以将 docker 的路径包含为 PATH=$PATH:~/mnt/e/Program\ Files/Docker/(放入 .bashrc),然后我可以从 bash 调用 docker.exe 运行 docker。

但是,嘿,这个 bash,我不想在命令(程序)的末尾写 .exe。我可以简单地添加一个别名 alias docker="docker.exe",但是我想使用 docker-compose 并且我必须添加另一个。我正在考虑向 .bashrc 添加一个脚本,该脚本将遍历路径变量并在路径变量中指定的每个路径中搜索 .exe 文件,并为每次出现添加一个别名,但这似乎不是一个非常干净的解决方案(但我想它会很好地达到它的目的)。

是否有一个简单而干净的解决方案来实现这一点?

【问题讨论】:

  • .bashrc 中只需要添加 2 个命令。 1) PATH 变量 2) 别名。对我来说它看起来很干净
  • 我讨厌人们从问题中提出不同的方法,但我现在正在这样做:使用 Linux

标签: windows bash ubuntu docker windows-subsystem-for-linux


【解决方案1】:

在我的 windows 10 中,解决方案是为 windows 安装 git-bash 和 docker。

在这个 bash 中,当我按下“docker”时,它可以工作 例如“docker ps” 我不需要创建别名或更改路径。

你可以从https://git-scm.com/download/win下载git-bash

然后从“开始”按钮,搜索“git bash”。 希望这个解决方案对你有好处

【讨论】:

    【解决方案2】:

    我在尝试使用 Docker for Windows from WSL 时遇到了同样的问题。

    有大量现有的 shell 脚本可以在 Linux 下正常运行,而且大部分也在 WSL 下运行,直到由于 docker: command not found 而失败。到处更改dockerdocker.exe 太麻烦且不便携。


    首先尝试在~/.bashrc 中使用aliases 作为here 的解决方法:

    shopt -s expand_aliases
    alias docker=docker.exe
    alias docker-compose=docker-compose.exe
    

    但它要求每个脚本都在interactive mode 中运行,并且仍然在doesn't work within backticks 中运行而无需修改脚本。


    然后尝试exported bash functions 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
    

    脚本自动将absolute path 指向$PATH 中的任何Windows 可执行文件,并将其符号链接到~/.local/bin,而~/.local/bin 也驻留在WSL 上的$PATH 中。

    如果需要,这种方法可以很容易地进一步扩展为自动链接给定目录中的任何 exe。但是链接整个 $PATH 将是一种矫枉过正。 )

    【讨论】:

      【解决方案3】:

      您应该能够简单地将可执行目录设置为您的 PATH。使用导出来持久化。

      命令: export PATH=$PATH:/path/to/directory/executable/is/located/in

      【讨论】:

      • 嘿,Thomas,OP 已经知道这一点,并且正在寻找更“简单和干净的解决方案”。
      • 我刚刚重读了您的问题。我很抱歉,但据我所知,没有更简单的解决方案:(
      猜你喜欢
      • 2018-03-19
      • 2017-05-09
      • 2014-07-23
      • 2016-12-21
      • 1970-01-01
      • 1970-01-01
      • 2017-12-04
      • 2022-10-24
      • 1970-01-01
      相关资源
      最近更新 更多