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

时间:2016-06-16 15:33:21

标签: node.js linux bash shell process

bash中,您可以source.在当前上下文中运行一些bash脚本。所以如果你有例如文件foo包含alias bar='echo bam',当您按

运行时
$ . foo

它会将此别名从文件foo添加到您当前的上下文中。

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

如何运行改变当前bash上下文的节点脚本?

ps:任何例子都是好的。节点脚本只能更改我的目录,但它必须再次发生在我当前的bash上下文中。

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

1 个答案:

答案 0 :(得分:2)

在撰写my Node implementation of wd时,我一直在努力解决同样的问题。 AFAIK由于您已知的原因,无法做您想做的事情。但是,如果要在源shell脚本中使用节点,可以采用一种方法,类似。

因此您无法获取节点脚本,但您可以执行的是在源shell脚本中执行节点脚本。性能不是很好,但它确实有效。例如,您不能将process.chdir('/tmp');放在节点脚本中,并期望它更改当前进程中的当前工作目录。但可以做的是创建一个节点脚本console.log是一个目录,并在 sourced shell 脚本中执行cd $(node myscript.js)之类的脚本。有关此示例,请查看我上面链接的项目中的代码。在那里我使用bash函数来获取全局安装的npm模块的shell脚本,然后执行JS以更改当前目录(至少在bash和zsh中)。它不是很漂亮,但它确实有用。

我知道这不是你要找的答案,但是我已经找到了一种方法来使用node来操作当前的bash上下文。我实际上发现了这个问题,因为我只是想重构并寻找更好的方法来做到这一点。如果我找到更好的方法,我会让你知道;-)