2016-06-16 47 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上下文的方法非常接近。我真的發現這個問題,因爲我只是想重構,並尋找更好的方法來做到這一點。如果我找到了更好的方式,我會讓你知道;-)

相關問題