跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • bash 怎么拦截输入的所有命令?
未分類
15 8 月 2020

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

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

資深大佬 : monetto 7

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

  • 資深大佬 : TimePPT

    没咋折腾过,不过猜测是不是应该通过设置 PATH 解决共享问题。

  • 資深大佬 : TimePPT

    查到了官网这篇,试试
    《 Windows 与 Linux 的互操作性》
    https://docs.microsoft.com/zh-cn/windows/wsl/interop

  • 主 資深大佬 : monetto

    @TimePPT
    这个应该不是共享问题,因为目前 WSL 下是与 Win10 共享了环境变量的。比如说,我在 Win10 配置了 JAVA_HOME,然后 WSL 中也可以运行,只不过 Win10 直接输入 java 就可以了,而 WSL 中需要输入 java.exe 。所有 Win10 的命令都要加上.exe ,比较繁琐… 想解决这个问题~

  • 資深大佬 : TimePPT

    @monetto 了解,那就不清楚了。Mac 用了七八年,Windows 基本没碰过

  • 資深大佬 : liaojl

    设置个别名,alias git=/path/to/git.exe

  • 資深大佬 : fdppzrl

    好奇去搜了下。PS4 那个就是你要的了。https://stackoverflow.com/questions/6930527/bash-how-to-intercept-every-command

  • 資深大佬 : calmzhu

    echo $PATH 看一下 PATH 有哪些
    PATH 有优先级的。后面的目录下面的命令会覆盖前面的目录。

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

    担心影响其他的化。只写在用户目录下的.bash_profile 或者.bashrc 下。

  • 資深大佬 : sky96111

    @calmzhu 这方法行不通。在 wsl 中,windows PATH 中的命令必须保留后缀才能被执行,即使你吧 windows 的 path 放在了前面,你仍然需要输入 git.exe 才能调用

  • 資深大佬 : bashbot

    windows 系统的磁盘分区可以挂载到 WSL 中的,建立一个不带 exe 后缀名的链接到 windows 种的 exe 文件上,然后把链接加到 PATH 最前。
    我用的 cmder 好像自带这个功能了,不需要 exe 也可以自动识别 windows 系统种的可执行文件,只要加到 path 就行。

  • 資深大佬 : calmzhu

    @sky96111

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

    这次测了下。。。

    https://paste.ubuntu.com/p/qhsqq3hrrF/

  • 資深大佬 : allenhu

    话说你这个 EXE 能在 Ubuntu 下执行?

  • 資深大佬 : aloxaf

    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

    @allenhu 这是 wsl 的特性,win 原生程序可以在 wsl 下直接运行
    @calmzhu 我也这么想。毕竟在 linux 里要用到的 win 命令远不如 linux 命令多,工作量也小一点

  • 主 資深大佬 : monetto

    @TimePPT 感谢~ 但是感觉如果每一个命令都要写一个函数,有些太复杂了,如果只有 Win10 命令需求背景,不如直接 alias 了,不过很感谢能提供思路~

  • 主 資深大佬 : monetto

    @liaojl 目前就是这么搞得,太麻烦了啊..每配置一个都得 alias 一遍

  • 主 資深大佬 : monetto

    @bashbot 对…可以写一个脚本自动遍历所有 PATH,为每一个.exe 都这样弄,还方便一些…

  • 主 資深大佬 : monetto

    @fdppzrl 感谢解答,这个 stackoverflow 看起来对运行的命令没有任何影响啊,只是在命令执行前记录了。我的需求是把命令拦下来,并改变他的执行方式。比如让 ping 变成 cd 这种…囧 不过还是很感谢~

  • 主 資深大佬 : monetto

    @aloxaf 感谢感谢~ 我理解是有一个方法可以给 bash 啦,zsh 啦,ash 啦,通用的办法,不是仅仅适用于 zsh 的囧,感谢大佬提供解决方案,我稍后试一下~ 谢谢~

  • 主 資深大佬 : monetto

    @calmzhu 感谢提供思路~~ (逐个 alias 会不会太暴力了…我尝试加入自定义 path 吧)

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具