在bash
中,您可以source
或.
在当前上下文中运行一些bash脚本。所以如果你有例如文件foo
包含alias bar='echo bam'
,当您按
$ . foo
它会将源此别名从文件foo
添加到您当前的上下文中。
我知道如果我通常使用#!/usr/bin/env node
这样的第一行运行节点脚本,那么这个脚本在子shell中运行或作为单独的进程运行。我想避免这种情况,并使节点脚本作用于我当前的bash进程(上下文)。
如何运行改变当前bash上下文的节点脚本?
ps:任何例子都是好的。节点脚本只能更改我的目录,但它必须再次发生在我当前的bash上下文中。
ps2:子问题:如果它在节点中不可能(而且我很难相信这个)或者它很复杂那么它可能在其他地方语言?像PHP,Java,Ruby(我不会要求C,因为它很明显:)如果是这样,请给我一些例子。
答案 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上下文。我实际上发现了这个问题,因为我只是想重构并寻找更好的方法来做到这一点。如果我找到更好的方法,我会让你知道;-)