代码之家  ›  专栏  ›  技术社区  ›  antonio

有没有办法在zsh中获取任意bash脚本(即msys2包“shell”)的源代码?

  •  5
  • antonio  · 技术社区  · 6 年前

    我正在使用 make 从MSYS2项目内部来看,一般没有问题。但是,如果使用zsh,则无法切换子系统。例如:

    source shell mingw64
    

    给予:

    /usr/bin/shell:58: bad substitution
    

    显然,在 shell 脚本和脚本的来源是因为它在调用shell中设置了环境变量。

    有人可以修正 代码,但在下一个 pacman -Syu .

    zsh中是否有源Bash脚本的通用解决方案(或特定于切换MSYS子系统的解决方案)?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Charles Duffy    6 年前

    您不能在zsh中解释任意bash脚本,但可以启动一个新的bash副本,并给出脚本源代码的指示,然后将控制权移交给zsh解释器:

    bash -c 'set -a; source shell mingw64 && exec zsh -i'
    

    因此,zsh解释器将继承导出的环境变量和通过获取bash脚本所做的工作目录更改;它 不会 继承shell局部(非导出)变量、别名或函数。

    set -a 指示bash默认导出所有变量,从而确保源代码脚本设置的变量尽可能放置在环境中,而不是保持shell本地。这对于无法导出的类型(如数组)的值不起作用,但这是一种合理的临时措施。


    顺便说一下,有一个 upstream ticket 要求此代码与兼容 /bin/sh . 如果发生这种情况,zsh将能够在POSIX兼容模式下对其进行解释,您可以临时按如下方式输入:

    emulate sh -c 'source shell mingw64'