簡體   English   中英

從JS采購Shell腳本

[英]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的外殼永遠不會看到該變量。

這樣做至少有兩個原因。 sourceBash內部命令 ,默認情況下,節點會生成/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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM