[英]Sourcing a shell script from JS
假設我們有一個包含以下內容的env.sh
export SOME_VAL="abcd"
我們想從JS(node.js)腳本bootstrap.js
此shell腳本。
const childProcess = require('child_process');
const cmd = '. ' + pathToEnvScript;
childProcess.exec(cmd, (err, stdout, stderr) => {
if (err) console.error(err);
console.log(stdout);
})
這就是我們所謂的bootstrap.js
。
echo $SOME_VAL # empty
node bootstrap.js
echo $SOME_VAL # empty
為什么采購沒有任何效果? 如果我們從終端調用source env.sh
,則采購有效,但不適用於node bootstrap.js
。
鑒於
子進程無法修改其父環境(除非您破解您的shell)
最好的辦法是
讓nodejs告訴您的Shell如何執行更新其環境的操作,就像源腳本本身一樣進行。
我假設您只對變量感興趣,而對函數不感興趣。
這是您的解決方案。
bootstrap.js :
const childProcess = require('child_process');
const script = process.argv[2];
childProcess.exec("env > ./1.txt; . ./"+script+" >/dev/null 2>&1; env > ./2.txt; diff 1.txt 2.txt | grep '^>'", (err, stdout, stderr) => {
stdout.split('\n').forEach((line) => console.log(line.substr(2)));
})
以及如何稱呼它:
echo $SOME_VAL # empty
eval `node bootstrap.js ./file.sh`
echo $SOME_VAL # abcd
childProcess.exec(command)
生成一個shell,然后在該shell中執行command
。 使用export
使變量可用於Shell的子進程,但不可用於其父進程。 Node和您從中調用Node的外殼永遠不會看到該變量。
這樣做至少有兩個原因。 source
是Bash內部命令 ,默認情況下,節點會生成/bin/sh
。 即使您告訴child_process.exec
生成一個Bash shell:
child_process.exec("ls", { shell: "/bin/bash" }, (err, stdout) => ())
然后將source
變量添加到Shell進程的環境中,而不是node.js的環境中。
我不知道您的項目的確切具體要求是什么,但是最好的選擇可能是在節點中打開文件並解析其內容以找到鍵/值對,並以此方式設置節點的環境。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.