Distributions
› Ubuntu
› Fedora
› CentOS
中文资源站
› 网易开源镜像站
monetto
V2EX  ›  Linux

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

  •  
  •   monetto · Aug 25, 2020 · 4464 views
    This topic created in 2265 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

    这次测了下。。。

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