有没有一种方法在zsh中调用任意bash脚本(例如msys2-packages "shell")?

5

我在MSYS2项目中使用make,通常没有什么问题。但是,如果我使用zsh,我就无法切换子系统。例如:

source shell mingw64

提供:

/usr/bin/shell:58: bad substitution

显然,shell脚本中有bash特定的代码,并且该脚本被源化了,因为它在调用shell中设置了环境变量。

一个解决方法是修改shell代码,但这可能会被覆盖或变得不兼容,在下一次pacman -Syu之后。

是否有一般性的解决方案可以在zsh中源化Bash脚本(或针对切换MSYS子系统的特定解决方案)?


2
如果您关心这个问题,您应该向 https://github.com/AlexPux/MSYS2-packages 提交一个拉取请求。 - David Grayson
现在还不清楚make在这一切中扮演的角色。source命令是从Makefile调用的吗?您能提供一个[MCVE]吗?如果您的一个source shell mingw64命令MCVE,那么Make与问题有什么关系呢? - Charles Duffy
@CharlesDuffy: 是的,MCVE是在zsh中执行的source shell mingw64。我提到使用make的原因是MSYS2的一个强制理由就是在Windows中“制作”GNU/POSIX程序的二进制文件。您可以在mingw子系统下获取POSIX仿真,并切换到mingwXX子系统以获取本机二进制文件。当然,没有什么阻止我们只是为了使用Linux shells而使用MSYS2,例如zsh。在后一种情况下,shell无法正常工作。我不是在询问如何从bash源zsh,因为我认为没有通用的解决方案。但是,从zsh切换MSYS2子系统应该是可能的。 - antonio
@antonio,这就是为什么有一个开放的上游请求,要求msys 'shell'命令的版本与所有符合POSIX标准的shell兼容。无论如何,根据我的判断,如果不需要组装Windows系统(或者审核'shell'命令的源代码以确定是否存在无法通过环境继承的任何内容),我已经回答了你的问题;如果使用给定的'bash -c'命令,则应启动一个新的zsh shell以配置mingw64目标软件的构建。 - Charles Duffy
1个回答

1

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

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

那个zsh解释器将继承通过源bash脚本所导出的环境变量和工作目录更改;它不会继承shell-local(非导出)变量,别名或函数。 set -a指示bash默认导出所有变量,从而确保由你的源脚本设置的变量尽可能放置在环境中而不是保留在shell-local中。这对于无法导出的类型的值(例如数组)不起作用,但是是一个合理的临时措施。
顺便提一下--有一个上游票要求将此代码与/bin/sh兼容。 如果发生这种情况,当处于POSIX兼容模式时,zsh将能够解释它,您可以按以下方式暂时进入该模式:
emulate sh -c 'source shell mingw64'

因为某些原因:x = 123bash -c 'set -a; source shell mingw64 && exec zsh -iecho $ x 不会给出 123。而且,在某些子系统切换后,将会有很多个 zsh 进程。因此,应该通过一个 zsh 函数/别名包装 shell 添加 kill -9 parent-shell-pid - antonio
@antonio,在调用bash之前,您需要export x,或者使用set -a来启用自动导出变量。而且,如果您不想留下一个父进程,绝对不要杀死您的父进程--使用exec将当前shell替换为子shell,完全不留下父进程;exec bash -c 'set -a; source shell mingw64 && exec zsh -i'不会增加内存中运行进程的数量,因为旧的zsh实例用bash替换自己,然后再次用zsh替换自己。 - Charles Duffy
@antonio,即使终止进程是一个好主意,kill -9 几乎普遍不是 -- 它会阻止你的进程能够在自身清理之后进行清理,并且只有在存在防止清理进程本身挂起的故障时才应该使用它(例如,如果清理进程本身正在挂起)。除非你有一个极其强烈的理由,否则请使用 SIGTERM 而不是 SIGKILL。 - Charles Duffy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接