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

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

  •  
  •   oska874 · 2015-08-04 11:16:07 +08:00 · 5500 次点击
    这是一个创建于 3386 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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
    chuhades
        1
    chuhades  
       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   ·   实用小工具   ·   2716 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 07:30 · PVG 15:30 · LAX 23:30 · JFK 02:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.