Windows 上的 Bash - exe 文件的别名

2023-11-21

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

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

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

有没有一个简单干净的解决方案来实现这一目标?


我在尝试使用时遇到了同样的问题来自 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 就有点矫枉过正了。 )

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows 上的 Bash - exe 文件的别名 的相关文章

随机推荐

  • HtmlAgilityPack.HtmlDocument Cookie

    这与脚本内 可能在脚本标签内 设置的cookie有关 System Windows Forms HtmlDocument执行这些脚本和cookies集 比如document cookie etc 可以通过其检索Cookies财产 我假设Ht
  • 为什么随机访问迭代器的算术运算符接受/返回 int 而不是 size_t?

    由于大多数操作都在std vector要求 返回size t 这就是我用于索引的类型 但现在我已经启用了所有编译器警告来修复一些我知道的签名 未签名转换问题 这条消息让我感到惊讶 警告 C4365 参数 从 size t 转换为 w64 i
  • Java的notify()在wait()之前运行?

    public class ThreadA public static void main String args ThreadB b new ThreadB b start synchronized b try System out pri
  • 以编程方式确定在另一个进程中加载​​哪些模块? (操作系统)

    我觉得我想做的事情非常简单 我只是不确定到底该怎么做 具体来说 我只想获取在另一个进程中加载 的模块 共享 动态库 的列表 以及获取该模块在给定进程中所在位置的起始地址 使用 GDB 获取这些信息非常简单 您只需连接到该进程 然后输入 信息
  • 如何在 Excel 中表示日期时间

    代表一个事物的最佳方式是什么DateTime在 Excel 中 我们使用同步融合基本 XlsIO将值输出到 Excel 文档 效果很好 但我不知道如何显示DateTime在一列中 当我自己直接在 Excel 中执行此操作时也不会 难道不可能
  • codeigniter 获取所有声明的路由

    如何获取codeigniter中所有声明的路由 像前一样 print r 路线 因为这是问题所在 如果客户将其用户名注册为 facebook 他将被路由到帐户 facebook login 而不是他的个人资料 如果我更改路由顺序 所有链接将
  • Common Lisp:#+nil 是什么?

    前几天 也许是昨天 我对此感到很困惑 nil读取时间条件发现于https github com billstclair defperson blob master defperson lisp L289 经过一番深入思考 我得出的结论是 这
  • 为什么从 python 游标执行 sql 查询时需要使用 3 个引号?

    我遇到过一些连接到 MySQL 数据库的 Python 程序 在代码中 我看到了查询execute 函数用 3 个引号括起来 我想知道其中的原因 我还注意到 仅在创建 插入和更新表时使用 3 个引号 而不是在选择行时使用 cursor ex
  • 如果饼图中的值为 0%,如何删除线条

    我正在制作饼图 为此 我正在使用MPAndroid图表库中 任何数据或多个数据的值可能包含 0 并且我使用饼图之外的方式显示值setYValuePosition PieDataSet ValuePosition OUTSIDE SLICE
  • 双引号之间的 Razor 代码

    在 Razor View Engine 模板中 我想要执行以下操作 我想要放置一些codehtml 的双引号之间属性 问题是我想要插入的代码片段本身包含一些双引号 a href Url Action page a 你可以很容易地看到事情是如
  • 在 Keras 中使用自定义损失函数时的批量大小问题

    我正在通过定义自定义损失函数对标准神经网络进行轻微修改 自定义损失函数不仅取决于 y true 和 y pred 还取决于训练数据 我使用描述的包装解决方案实现了它here 具体来说 我想定义一个自定义损失函数 它是标准 mse 加上输入与
  • 长时间运行的任务被取消后如何正确清理

    我创建了一个类 其目的是抽象出对队列的并发访问的控制 该类设计为在单个线程上实例化 由多个线程写入 然后从后续的单个线程中读取 我在类中生成了一个长时间运行的任务 它将执行阻塞循环 并在项目成功出列时触发一个事件 我的问题是 我是否实现了取
  • 如何将sqlite同步到Mysql

    大家好你们好 我有个问题 如果我有一台运行 sqlite 的计算机 并且我想让 sqlite 同步外网中的 Mysql 服务器 如果sqlite中的数据已被 更改 修改 我如何同步我的MYSQL DB和sqlite 以便当MYSQL DB中
  • 将 Excel 文件合并为一个

    我有几百个 Excel 文件 每个文件的第一张纸上都有一些数据 我被要求用 C 编写一个控制台应用程序 它将所有 Excel 文件合并到一个文档中 同时保留格式 合并文件是一个单独的工作簿 其中包含合并到文档中的每个文件的工作表 不幸的是
  • Jenkins-作业失败

    我已经设置了一个 uberSVN 服务器 并运行 Jenkins 以使用 PHP WebWare 控制 SVN 存储库 我已经遇到了问题并寻找解决方案已经好几个小时了 现在我希望这是最后一个 但我没有找到任何答案 Publishing Cl
  • LINQ:如何在多个字段上使用 linq 扩展方法样式进行 JOIN?

    在下面的连接中 我想使用多个字段来进行连接 而不仅仅是一个字段 var join group Join procSums g gt g DeptID ps gt ps key deptID g ps 我发现的所有示例都使用查询样式来执行此操
  • 检测连接的音频设备 iOS

    我正在尝试找出如何检测 iphone ipad ipod 上是否连接了任何音频设备 我知道有关音频路由调用和路由更改回调的所有信息 但这些并没有告诉我有关附加内容的任何信息 它们仅报告音频当前路由的位置 例如 我需要知道当音频通过扬声器传送
  • 如何在 theano 中获得一维卷积

    我能找到的唯一函数是二维卷积此处描述 有没有优化的一维函数 看起来好像这是开发中 我意识到我可以使用conv2d 通过将宽度或高度指定为 1 对于函数conv2d 参数image shape获取长度为 4 的列表 其中包含 number i
  • Node.js:捕获“child_process.spawn”的 STDOUT

    我需要在自定义中捕获stream生成的子进程的输出 child process spawn command args options 例如 var s fs createWriteStream tmp test txt child proc
  • Windows 上的 Bash - exe 文件的别名

    我正在 Windows 上的 Ubuntu 上使用 Bash 这是在 Windows 10 上运行 bash 的方式 我安装了 Creators 更新 Ubuntu 版本是 16 04 我最近在玩 npm node js 和 Docker