请稍侯

Zsh的坑s

使用zsh 中遇到的坑s

zsh 配合 oh-my-zsh 很好用,很多插件,很多功能,提升了很多生产力,但是使用过程中,还是遇到了很多坑,大多都是不兼容惹出来的祸。

  1. zsh: no matches found: --exclude=*.map

    本来想用 aliasgrep 重定义下,增加一些默认参数,然后修改了 ~/.zshrc

     alias grep="grep --color -n -r --exclude-dir={.git,.svn} --exclude=tags --exclude=*.{map,tmp,bin,elf,o,a,lib,so} 2>/dev/null "
    

    然后试着用了下新的grep,就报错了: zsh: no matches found: --exclude=*.map,开始怀疑是参数写的不对,然后改了半天突然想起来,以前执行 ls *.c 也会报错,果不其然,去掉了 *.{map,tmp,bin,elf,o,a,lib,so} 就好了,但是这个选项是我想要的,google 一下找到原因了,zsh 缺省情况下会自己解释 *,然后直接把 * 这个符号给了 ls/grep,所以出错了。

    解决办法:

    在 zsh 的配置文件 ~/.zshrc 中添加 setopt no_nomatch, 这样zsh 就直接把 * 交给命令解释去了,就不会出错了。

  2. zsh: no such file or directory: powerpc-fsl-linux-gnuspe-gcc -m32 -mcpu=8548 -mabi=spe -mspe -mfloat-gprs=double --sysroot=/workspace/program/opt/fsl-networking/QorIQ-SDK-V1.7/sysroots/ppce500v2-fsl-linux-gnuspe

    工作中要用 yocto 生成的 gcc 工具链,项目开始时我用的 bash,一点问题都没的,直接 $CC test.c 就可以编译代码了。后来切换到 zsh,只要执行 $CC 就会提示上面的错误,很无奈,只能每次要编译的时候手动切换回 bash 编译,然后切换回 zsh 上将可执行文件传到开发板上(zsh 的 ”上一条执行“ 功能太方便了,不用每次重新输入scp 一串命令,或者在历史记录里找半天)

    解决办法:

    还没有。。。。。。

  3. 进入 git 目录反应很慢(oh-my-zsh 的锅)

    话说我的笔记本配置也不差:i7-4750HQ 4核8线程,16G 内存,256G SSD,但是刚开始用 zsh 的时候,很多时候进入linux 源码树目录都要等几十秒,而在树莓派上,这个等待时间就更久了。上网查了下,有人说是oh-my-zsh 的git plugin 造成的。

    默认情况下,oh-my-zsh 的 git.zsh 插件会在git 的仓库目录中显示分支信息和当前的状态等,但这也使得在 git 目录中输入命令会出现明显的延时,即使用 git-fast 插件也没什么效果。

    解决办法:

    把 ~/.oh-my-zsh/lib/git.zsh 里面的 git_prompt_info 函数替换为

     function git_prompt_info() {
         ref=$(git symbolic-ref HEAD 2> /dev/null) || return
         echo "$ZSH_THEME_GIT_PROMPT_PREFIX${ref#refs/heads/}$ZSH_THEME_GIT_PROMPT_SUFFIX"
     }
    

    然后,处理 git 目录的速度就恢复正常了,除了偶尔会在开机第一次进入大项目的目录时会卡顿几秒。

    ps:现在新版的oh-my-zsh 已经处理了这个问题了,不用在自己手动更新了。

(随时更新)