V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
monetto
V2EX  ›  Linux

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

  •  
  •   monetto · 2020-08-25 16:16:53 +08:00 · 3437 次点击
    这是一个创建于 1587 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

    这次测了下。。。

    https://paste.ubuntu.com/p/qhsqq3hrrF/
    allenhu
        11
    allenhu  
       2020-08-25 21:00:35 +08:00 via Android
    话说你这个 EXE 能在 Ubuntu 下执行?
    aloxaf
        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
    ```
    sky96111
        13
    sky96111  
       2020-08-25 21:38:39 +08:00
    @allenhu 这是 wsl 的特性,win 原生程序可以在 wsl 下直接运行
    @calmzhu 我也这么想。毕竟在 linux 里要用到的 win 命令远不如 linux 命令多,工作量也小一点
    monetto
        14
    monetto  
    OP
       2020-08-26 08:46:10 +08:00
    @TimePPT 感谢~ 但是感觉如果每一个命令都要写一个函数,有些太复杂了,如果只有 Win10 命令需求背景,不如直接 alias 了,不过很感谢能提供思路~
    monetto
        15
    monetto  
    OP
       2020-08-26 08:46:54 +08:00
    @liaojl 目前就是这么搞得,太麻烦了啊..每配置一个都得 alias 一遍
    monetto
        16
    monetto  
    OP
       2020-08-26 08:48:36 +08:00
    @bashbot 对...可以写一个脚本自动遍历所有 PATH,为每一个.exe 都这样弄,还方便一些...
    monetto
        17
    monetto  
    OP
       2020-08-26 08:57:40 +08:00
    @fdppzrl 感谢解答,这个 stackoverflow 看起来对运行的命令没有任何影响啊,只是在命令执行前记录了。我的需求是把命令拦下来,并改变他的执行方式。比如让 ping 变成 cd 这种...囧 不过还是很感谢~
    monetto
        18
    monetto  
    OP
       2020-08-26 09:00:30 +08:00
    @aloxaf 感谢感谢~ 我理解是有一个方法可以给 bash 啦,zsh 啦,ash 啦,通用的办法,不是仅仅适用于 zsh 的囧,感谢大佬提供解决方案,我稍后试一下~ 谢谢~
    monetto
        19
    monetto  
    OP
       2020-08-26 09:02:28 +08:00
    @calmzhu 感谢提供思路~~ (逐个 alias 会不会太暴力了...我尝试加入自定义 path 吧)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2694 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 08:25 · PVG 16:25 · LAX 00:25 · JFK 03:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.