有没有办法在 zsh 中获取任意 bash 脚本(即 msys2-packages "shell")?
Is there a way to source arbitrary bash scripts (ie. msys2-packages "shell") in zsh?
我在 MSYS2 项目中使用 make
,通常没有问题。但是,如果我使用 zsh,则无法切换子系统。例如:
source shell mingw64
给出:
/usr/bin/shell:58: bad substitution
显然,在 shell
脚本中有 bash 特定代码,并且脚本是源代码,因为它在调用 shell 时设置了环境变量。
可以修复此修改 shell
代码,但在下一个 pacman -Syu
.
之后可能会被覆盖或变得不兼容
在 zsh 中是否有源 Bash 脚本的通用解决方案(或特定于切换 MSYS 子系统的解决方案)?
你不能在 zsh 中解释任意 bash 脚本,但你可以开始一个新的 bash 副本,并提供脚本来源的说明,然后将控制权移交给 zsh 解释器:
bash -c 'set -a; source shell mingw64 && exec zsh -i'
zsh 解释器将因此继承导出的环境变量和通过获取 bash 脚本所做的工作目录更改;它不会继承shell-local(non-exported)变量、别名或函数。
set -a
指示 bash 默认导出所有变量,从而确保源脚本设置的变量尽可能放置在环境中而不是保留 shell-local。这不适用于无法导出的类型的值(例如数组),但这是一个合理的临时措施。
顺便说一下——有一个 upstream ticket 要求使此代码与 /bin/sh
兼容。如果发生这种情况,zsh 将能够在 POSIX-compatibility 模式下解释它,您可以暂时输入如下:
emulate sh -c 'source shell mingw64'
我在 MSYS2 项目中使用 make
,通常没有问题。但是,如果我使用 zsh,则无法切换子系统。例如:
source shell mingw64
给出:
/usr/bin/shell:58: bad substitution
显然,在 shell
脚本中有 bash 特定代码,并且脚本是源代码,因为它在调用 shell 时设置了环境变量。
可以修复此修改 shell
代码,但在下一个 pacman -Syu
.
在 zsh 中是否有源 Bash 脚本的通用解决方案(或特定于切换 MSYS 子系统的解决方案)?
你不能在 zsh 中解释任意 bash 脚本,但你可以开始一个新的 bash 副本,并提供脚本来源的说明,然后将控制权移交给 zsh 解释器:
bash -c 'set -a; source shell mingw64 && exec zsh -i'
zsh 解释器将因此继承导出的环境变量和通过获取 bash 脚本所做的工作目录更改;它不会继承shell-local(non-exported)变量、别名或函数。
set -a
指示 bash 默认导出所有变量,从而确保源脚本设置的变量尽可能放置在环境中而不是保留 shell-local。这不适用于无法导出的类型的值(例如数组),但这是一个合理的临时措施。
顺便说一下——有一个 upstream ticket 要求使此代码与 /bin/sh
兼容。如果发生这种情况,zsh 将能够在 POSIX-compatibility 模式下解释它,您可以暂时输入如下:
emulate sh -c 'source shell mingw64'