bash 怎么拦截输入的所有命令?

2020-08-25 16:16:53 +08:00
 monetto

背景是这样的,部门没有 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...

3408 次点击
所在节点    Linux
19 条回复
TimePPT
2020-08-25 16:23:37 +08:00
没咋折腾过,不过猜测是不是应该通过设置 PATH 解决共享问题。
TimePPT
2020-08-25 16:25:53 +08:00
查到了官网这篇,试试
《 Windows 与 Linux 的互操作性》
https://docs.microsoft.com/zh-cn/windows/wsl/interop
monetto
2020-08-25 16:59:13 +08:00
@TimePPT
这个应该不是共享问题,因为目前 WSL 下是与 Win10 共享了环境变量的。比如说,我在 Win10 配置了 JAVA_HOME,然后 WSL 中也可以运行,只不过 Win10 直接输入 java 就可以了,而 WSL 中需要输入 java.exe 。所有 Win10 的命令都要加上.exe ,比较繁琐... 想解决这个问题~
TimePPT
2020-08-25 17:24:57 +08:00
@monetto 了解,那就不清楚了。Mac 用了七八年,Windows 基本没碰过 😂

搜到这篇,好像是通过 bash 函数搞定了,可以参考下
https://zhuanlan.zhihu.com/p/140767014
liaojl
2020-08-25 18:01:38 +08:00
设置个别名,alias git=/path/to/git.exe
fdppzrl
2020-08-25 18:26:32 +08:00
calmzhu
2020-08-25 18:26:52 +08:00
echo $PATH 看一下 PATH 有哪些
PATH 有优先级的。后面的目录下面的命令会覆盖前面的目录。

所以把 windows 下面的目录放在 Ubuntu 的后面就行了。

担心影响其他的化。只写在用户目录下的.bash_profile 或者.bashrc 下。
sky96111
2020-08-25 18:38:42 +08:00
@calmzhu 这方法行不通。在 wsl 中,windows PATH 中的命令必须保留后缀才能被执行,即使你吧 windows 的 path 放在了前面,你仍然需要输入 git.exe 才能调用
bashbot
2020-08-25 19:30:05 +08:00
windows 系统的磁盘分区可以挂载到 WSL 中的,建立一个不带 exe 后缀名的链接到 windows 种的 exe 文件上,然后把链接加到 PATH 最前。
我用的 cmder 好像自带这个功能了,不需要 exe 也可以自动识别 windows 系统种的可执行文件,只要加到 path 就行。
calmzhu
2020-08-25 19:44:25 +08:00
@sky96111

那就只能笨方法了。
写个脚本遍历找一下 PATH 下面的 exe 文件然后自动 alias

这次测了下。。。

https://paste.ubuntu.com/p/qhsqq3hrrF/
allenhu
2020-08-25 21:00:35 +08:00
话说你这个 EXE 能在 Ubuntu 下执行?
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
```
sky96111
2020-08-25 21:38:39 +08:00
@allenhu 这是 wsl 的特性,win 原生程序可以在 wsl 下直接运行
@calmzhu 我也这么想。毕竟在 linux 里要用到的 win 命令远不如 linux 命令多,工作量也小一点
monetto
2020-08-26 08:46:10 +08:00
@TimePPT 感谢~ 但是感觉如果每一个命令都要写一个函数,有些太复杂了,如果只有 Win10 命令需求背景,不如直接 alias 了,不过很感谢能提供思路~
monetto
2020-08-26 08:46:54 +08:00
@liaojl 目前就是这么搞得,太麻烦了啊..每配置一个都得 alias 一遍
monetto
2020-08-26 08:48:36 +08:00
@bashbot 对...可以写一个脚本自动遍历所有 PATH,为每一个.exe 都这样弄,还方便一些...
monetto
2020-08-26 08:57:40 +08:00
@fdppzrl 感谢解答,这个 stackoverflow 看起来对运行的命令没有任何影响啊,只是在命令执行前记录了。我的需求是把命令拦下来,并改变他的执行方式。比如让 ping 变成 cd 这种...囧 不过还是很感谢~
monetto
2020-08-26 09:00:30 +08:00
@aloxaf 感谢感谢~ 我理解是有一个方法可以给 bash 啦,zsh 啦,ash 啦,通用的办法,不是仅仅适用于 zsh 的囧,感谢大佬提供解决方案,我稍后试一下~ 谢谢~
monetto
2020-08-26 09:02:28 +08:00
@calmzhu 感谢提供思路~~ (逐个 alias 会不会太暴力了...我尝试加入自定义 path 吧)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/701326

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX