节点脚本如何在我当前的bash上下文(进程)中运行?

bash你可以source. 在当前的上下文中运行一些bash脚本。 所以,如果你有例如文件fooalias bar='echo bam'在其中,当你运行它像

 $ . foo 

它会从文件foo中将这个别名发送到当前的上下文中。

我知道,如果我通常使用#!/usr/bin/env node第一行来运行节点脚本,那么这个脚本在子shell中运行,或者作为单独的进程运行。 我想避免这一点,并使节点脚本作用于我当前的bash进程(上下文)。

我怎样才能运行节点脚本,改变我当前的bash上下文?

ps:任何例子都不错。 节点脚本只能改变我的目录,但它也必须发生在我当前的bash上下文中。

ps2:小问题:如果在节点中是不可能的(我很难相信这个),或者它非常复杂,那么在其他语言中是可能的吗? 像PHP,Java,Ruby(我不问C,因为它很明显:)如果是这样,请给我一些例子。

编写Node的wd实现时,我也遇到了同样的问题。 AFAIK没有办法做你想做的事情,因为你已经知道的原因。 但是,如果您想在源代码脚本中使用节点,那么有一种解决方法。

所以你不能源节点脚本,但你可以做的是在一个源脚本中执行节点脚本。 性能不是很好,但它的工作原理。 例如,你不能把process.chdir('/tmp'); 在一个节点脚本中,并期望它改变当前进程中的当前工作目录。 但你可以做的是制作一个节点脚本console.log sa目录,并执行一个类似于cd $(node myscript.js)脚本。 有关这方面的一个例子,请查看我上面链接的项目中的代码。 在那里,我使用bash函数来获取全局安装的npm模块的shell脚本,然后执行JS来更改当前目录(至less在bash和zsh中)。 这不完全漂亮,但它的作品。

我知道这不是你正在寻找的答案,但是和我find一种使用节点来操纵当前bash上下文的方法一样。 我真的发现这个问题,因为我只是想重构,并寻找一个更好的方式来做到这一点。如果我find更好的方式,我会让你知道;-)