背景是这样的,部门没有 Mac 了,统一 TP...Win10 的系统,考虑到稳定性的问题不太想用桌面版 Linux...而且要申请网络权限太麻烦...
因此现在是在 Win10 里安装了 WSL1 + Ubuntu20.04 ,然后 WSL1 安装 zsh 来日常用。
但是 Ubuntu 自带了 GIT 和 Python,如何在做到不卸载自带的 git 的情况下,做到默认使用 win10 的 git? 目前想到的是,拦截所有 zsh 命令,然后判定命令(git)有没有(git.exe),这样做...不知道思路正确否。
现在直接 alias git=git.exe 用的...总感觉太麻烦了...一个一个设置 囧
求大佬有没有解决思路 Orz...
1
TimePPT 2020-08-25 16:23:37 +08:00
没咋折腾过,不过猜测是不是应该通过设置 PATH 解决共享问题。
|
2
TimePPT 2020-08-25 16:25:53 +08:00
|
3
monetto OP @TimePPT
这个应该不是共享问题,因为目前 WSL 下是与 Win10 共享了环境变量的。比如说,我在 Win10 配置了 JAVA_HOME,然后 WSL 中也可以运行,只不过 Win10 直接输入 java 就可以了,而 WSL 中需要输入 java.exe 。所有 Win10 的命令都要加上.exe ,比较繁琐... 想解决这个问题~ |
4
TimePPT 2020-08-25 17:24:57 +08:00
@monetto 了解,那就不清楚了。Mac 用了七八年,Windows 基本没碰过 😂
搜到这篇,好像是通过 bash 函数搞定了,可以参考下 https://zhuanlan.zhihu.com/p/140767014 |
5
liaojl 2020-08-25 18:01:38 +08:00 via iPhone
设置个别名,alias git=/path/to/git.exe
|
6
fdppzrl 2020-08-25 18:26:32 +08:00 via Android
好奇去搜了下。PS4 那个就是你要的了。https://stackoverflow.com/questions/6930527/bash-how-to-intercept-every-command
|
7
calmzhu 2020-08-25 18:26:52 +08:00
echo $PATH 看一下 PATH 有哪些
PATH 有优先级的。后面的目录下面的命令会覆盖前面的目录。 所以把 windows 下面的目录放在 Ubuntu 的后面就行了。 担心影响其他的化。只写在用户目录下的.bash_profile 或者.bashrc 下。 |
8
sky96111 2020-08-25 18:38:42 +08:00
@calmzhu 这方法行不通。在 wsl 中,windows PATH 中的命令必须保留后缀才能被执行,即使你吧 windows 的 path 放在了前面,你仍然需要输入 git.exe 才能调用
|
9
bashbot 2020-08-25 19:30:05 +08:00
windows 系统的磁盘分区可以挂载到 WSL 中的,建立一个不带 exe 后缀名的链接到 windows 种的 exe 文件上,然后把链接加到 PATH 最前。
我用的 cmder 好像自带这个功能了,不需要 exe 也可以自动识别 windows 系统种的可执行文件,只要加到 path 就行。 |
10
calmzhu 2020-08-25 19:44:25 +08:00
@sky96111
那就只能笨方法了。 写个脚本遍历找一下 PATH 下面的 exe 文件然后自动 alias 这次测了下。。。 https://paste.ubuntu.com/p/qhsqq3hrrF/ |
11
allenhu 2020-08-25 21:00:35 +08:00 via Android
话说你这个 EXE 能在 Ubuntu 下执行?
|
12
aloxaf 2020-08-25 21:03:16 +08:00
zsh 的问题就不要写 bash 啊喂(吐槽)
这事儿没有很优雅的解决方案,虽然有个 preexec hook 可以在命令被执行之前做点事情,但是无法改变即将被执行的命令。 我能想到的办法是:自定义一个 zle widget 替换掉 accept-line,然后在这里面判断被执行的命令有没有带 .exe 的版本,有的话就加上 exe,这样应该可以胜任只有一个命令的简单情况,示例: ``` my-accept-line() { emulate -L zsh local cmd=${${(z)BUFFER}[1]} if (( $+commands[$cmd.exe] )); then BUFFER=${BUFFER/$cmd/$cmd.exe} fi zle accept-line } zle -N my-accept-line bindkey '^M' my-accept-line ``` |
13
sky96111 2020-08-25 21:38:39 +08:00
|
14
monetto OP @TimePPT 感谢~ 但是感觉如果每一个命令都要写一个函数,有些太复杂了,如果只有 Win10 命令需求背景,不如直接 alias 了,不过很感谢能提供思路~
|
17
monetto OP @fdppzrl 感谢解答,这个 stackoverflow 看起来对运行的命令没有任何影响啊,只是在命令执行前记录了。我的需求是把命令拦下来,并改变他的执行方式。比如让 ping 变成 cd 这种...囧 不过还是很感谢~
|