2017-12-01 4 views
0

次の内容のenv.shがあるとします。JSからシェルスクリプトを入手する

export SOME_VAL="abcd" 

我々は、JS(Node.jsの)スクリプトbootstrap.jsからこのシェルスクリプトをソースにしたいです。

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では機能しません。

+0

あなたも、シェルスクリプトを調達するためにnodejsを使用したいと思うのはなぜ?私は、あなたの変数を子スコープから 'export 'する必要があると思います。 – RaphaMex

+0

いくつかのプロジェクト要件によって制限されています。私は方法について興味がある。 – hackjutsu

+0

オプションを教えてください。私はそれを明らかに不可能であることを回避するために、あなたの要件に関する詳細を必要とします。 – RaphaMex

答えて

0

これは少なくとも2つの理由で機能しません。 sourceBash internal command、デフォルトではノードは/bin/shです。あなたはBashシェル産卵するchild_process.execを告げても、そして:

child_process.exec("ls", { shell: "/bin/bash" }, (err, stdout) =>())

を、その後source D「変数は、シェルプロセスの環境、ではないのNode.jsの環境に追加されます。

私は、正確な特定の要件は、あなたのプロジェクトのためにあるのか分からないが、あなたの最善の策は、ノード内のファイルを開くと、キー/値のペアとセットノードの環境その方法を見つけるために、その内容を解析するかもしれません。

+0

それも私の最初の考えでした。しかし、ソーススクリプトは変数を計算することがあります。したがって、 'my_var =" abc "'の基本的な構文解析はうまくいかないかもしれません。 – RaphaMex

1

あなたができる最善を(あなたのシェルをハックしない限り)

子プロセスはその親のenvを変更できないことを考えると言うnodejs

メイクは、あなたのシェルそれはスクリプト自身をソースしていた場合と同じように、その環境を更新するために何をするか

私はあなたが変数やない機能にのみ関心があると仮定します。

ここにあなたの解決策があります。

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 
関連する問題