bash 和 zsh 在执行命令时有什么区别,同一个命令两个执行结果不同了 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
oska874
V2EX    Linux

bash 和 zsh 在执行命令时有什么区别,同一个命令两个执行结果不同了

  •  
  •   oska874 2015-08-04 11:16:07 +08:00 6086 次点击
    这是一个创建于 3792 天前的主题,其中的信息可能已经有所发展或是发生改变。
    rt,我定义了两个宏:
    ```
    export CC="powerpc-unknown-linux-gnuspe-gcc -m32 -mcpu=8548 -mabi=spe -mspe -mfloat-gprs=double"
    export CC1="powerpc-unknown-linux-gnuspe-gcc"
    ```
    然后调用 $CC1 test.c 编译在bash 和zsh 下都是ok的,但是 调用$CC 在bash 下是正常的,在zsh 下面就报错
    ```
    zsh: command not found: powerpc-unknown-linux-gnuspe-gcc -m32 -mcpu=8548 -mabi=spe -mspe -mfloat-gprs=double
    ```

    看起来zsh 是把宏里面的全部语句当成一条指令了,bash 则是简单的展开。
    有没有解决办法呢?

    ps:难怪android 要求编译时使用bash了,zsh 易用性可以,但是还有不少缺陷。
    14 条回复    2015-08-06 21:15:29 +08:00
    chu1337
        1
    chu1337  
       2015-08-04 12:14:11 +08:00
    try alias
    ```
    ~ export CC="ifconfig en0"
    ~ $CC
    zsh: command not found: ifconfig en0
    ~ alias CC="ifconfig en0"
    ~ CC
    en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    ether d0:e1:40:9a:63:3c
    inet6 fe80::d2e1:40ff:fe9a:633c%en0 prefixlen 64 scopeid 0x4
    inet 192.168.1.2 netmask 0xffffff00 broadcast 192.168.1.255
    nd6 optiOns=1<PERFORMNUD>
    media: autoselect
    status: active
    ```
    Jaylee
        2
    Jaylee  
       2015-08-04 12:20:08 +08:00
    楼上正解 正确用法应该是alias而不是export,出了问题先从自己身上找原因。
    extreme
        3
    extreme  
       2015-08-04 12:20:45 +08:00
    尝试一下eval:
    eval $CC test.c
    oska874
        4
    oska874  
    OP
       2015-08-04 12:35:25 +08:00
    @chuhades 忘了alias,不过这个宏定义是用在一个完整的工程里面的,改成alias之后,大量脚本要改
    @Jaylee 问题是为什么bash 可以而zsh 不行?要解决肯定有办法,alias 之后可以用在makefile、mk、脚本里面吗?
    @extreme 忘了eval 这个神器了。

    现在的问题是,在zsh 下得用alias ,但是这样一来命令行的命令和makefile 这些的命令不一致了,如果按照zsh 的方法改了的话,大量脚本,只能呵呵了。

    看来唯一的办法就是日常使用zsh 毕竟很方便,编译构建的时候还是乖乖的弄bash 得了,反正android 也推荐bash 来编译。
    sinxccc
        5
    sinxccc  
       2015-08-04 12:37:53 +08:00
    @Jaylee 有些场景下必须得用 export,比如指定 EDITOR。
    bramblex
        6
    bramblex  
       2015-08-04 12:45:10 +08:00 via Smartisan T1
    不同shell特性是不一样的!请在脚本开头加上

    #!/bin/bash

    这是最基本的了吧
    oska874
        7
    oska874  
    OP
       2015-08-04 13:13:01 +08:00
    @bramblex 无力了,makefile 里面可以加 #!/bin/sh 吗?
    @sinxccc 对啊。
    Panic
        8
    Panic  
       2015-08-04 13:22:45 +08:00
    确实不一样, 用 zsh 编译android 源码总是稀奇古怪的问题, bash 一把过
    EvilD
        9
    EvilD  
       2015-08-04 14:12:36 +08:00
    如果我没记错的话,bash,zsh,tcsh,fish的语法是不兼容的,zsh可以支持兼容不过默认是关的,fish好像是没有兼容模式的
    bramblex
        10
    bramblex  
       2015-08-04 21:00:26 +08:00 via Smartisan T1
    @oska874 makefile你写export干啥…
    oska874
        11
    oska874  
    OP
       2015-08-04 23:03:04 +08:00
    @bramblex 环境变量。makefile 调用。你可以看看kernel、uboot 之类的makefile
    bramblex
        12
    bramblex  
       2015-08-05 07:49:36 +08:00 via Smartisan T1
    @oska874 然而我zsh编译内核从来没出现过问题…
    oska874
        13
    oska874  
    OP
       2015-08-05 09:12:01 +08:00
    @bramblex 我又没说zsh 不能编译,问题是你用的工具、依赖关系,环境变量咱俩一样吗?
    hongjiang
        14
    hongjiang  
       2015-08-06 21:15:29 +08:00
    zsh里有个选项 SH_WORD_SPLIT,通过 setopt shwordsplit 开启一下
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2757 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 41ms UTC 13:39 PVG 21:39 LAX 05:39 JFK 08:39
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86