2016-06-16 49 views
1

bash您可以source.在您当前的上下文中运行一些bash脚本。所以如果你有文件fooalias bar='echo bam'它,当你运行它像节点脚本如何在我当前的bash上下文(进程)中运行?

$ . foo 

它将此别名从文件foo到您当前上下文。

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

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

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

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

+1

你可以替换你当前正在运行的程序在你的进程中使用'exec',但是你的进程会运行节点,并且bash将从进程中消失,那不是你想要的,对吧? – tkausl

+0

这就是我不想匆匆离开的问题。我希望能够改变我当前的bash上下文,然后完成我的脚本,并且只在脚本更改时仍然处于相同的bash上下文中。 – sobi3ch

回答

2

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

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

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

相关问题