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

标签 bash zsh msys2 mingw-w64

我在 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(非导出)变量、别名或函数。

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


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

emulate sh -c 'source shell mingw64'

关于bash - 有没有办法在 zsh 中获取任意 bash 脚本(即 msys2-packages "shell")?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48749840/

相关文章:

zsh:命令替换和正确引用

cmake - 如何检测 CMake 脚本是否在 MSYS2 环境中运行?

windows - 从 MSYS2 使用 Rust 在 Windows 上安装 Cargo

linux - 如何检测 bash shell 命令后跟逻辑 && AND 或 ||或者?

linux - 并行 fping 多台主机

apache - 使用 sed 取消注释 httpd.conf 中的一行

zsh - 如何在命令行中获得前一个命令的第 n 个参数?

bash - 在 MSYS 中浏览文件夹

linux - 避免同一 bash 脚本的两个实例

windows - Makefile 仅适用于 MSYS2 (WIndows) 上的相对路径