有没有办法在zsh中获取任意bash脚本(即msys2-packages"shell")?

ant*_*nio 5 bash zsh mingw-w64 msys2

make在MSYS2项目中使用,一般没有问题.但是,如果我使用zsh,我无法切换子系统.例如:

source shell mingw64
Run Code Online (Sandbox Code Playgroud)

得到:

/usr/bin/shell:58: bad substitution
Run Code Online (Sandbox Code Playgroud)

显然,shell脚本中存在bash特定代码,并且脚本是源代码,因为它在调用shell中设置环境变量.

可以修复这个修改shell代码,但是在下一个代码之后可能会被覆盖或变得不兼容pacman -Syu.

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

Cha*_*ffy 1

您无法在 zsh 中解释任意 bash 脚本,但您可以启动 bash 的新副本,并提供获取脚本源的说明,然后将控制权移交给 zsh 解释器:

bash -c 'set -a; source shell mingw64 && exec zsh -i'
Run Code Online (Sandbox Code Playgroud)

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

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


顺便说一句 - 有一个上游票证要求此代码与/bin/sh. 如果发生这种情况,zsh 将能够在 POSIX 兼容模式下解释它,您可以暂时输入如下:

emulate sh -c 'source shell mingw64'
Run Code Online (Sandbox Code Playgroud)