2

node.js を使用して spawn したいのですがecho $(python --version)、これを端末に入れても問題なく動作し、次のような結果が得られます

Python 2.7.12

しかし、次のコードを使用すると:

var spawn = require('child_process').spawn
var child = spawn('echo', ['$(python --version)'])
child.stdout.on('data', function(b){
    console.log(b.toString())
})

文字列リテラルがエコーされて返されます。

$(python --version)

引数をエスケープして適切に生成し、正しい出力を取得する方法。

編集:私は特にスポーンとエコーを使用したいのですが、スポーン引数を適切にエスケープする解決策があるかどうか知りたいです...

4

2 に答える 2

1

これはあなたを助けるはずです。

var exec = require('child_process').exec;
exec('python --version', function(error, stdout, stderr) {
console.log('stdout: ' + stdout);
console.log('stderr: ' + stderr);
if (error !== null) {
  console.log('exec error: ' + error);
}
});

コメントで要求されたとおりに編集:

var exec = require('child_process').exec;
exec('echo "Output goes here"', function(error, stdout) { //Replace echo with any other command.
    console.log(stdout);
});

出力: ここに出力が入ります。

これを確認したい場合があります:ノードでシェルコマンドの文字列をエスケープするにはどうすればよいですか?

于 2016-08-09T20:15:50.310 に答える
1

私はここでのパーティーにかなり遅れていることを認識していますが、これに対する答えを自分で探していたので:

問題は、spawn コマンドがデフォルトでシェルで実行されないことだと思います ( Node.js のドキュメントを参照)。Node.js は、すべてのシェル メタ文字をエスケープすることで、あなたを保護するためにこれを行っていると思います。これは、あなたが経験していたことです。シェル オプションを true に設定すると、次のように希望どおりに動作します。

require('child_process').spawn('echo', ['$(python --version)'], {shell: true, stdio: 'inherit'});

注意: stdio を親プロセスから継承するように設定すると、stdout を自分でログに記録する必要がなくなります:)

于 2017-12-21T07:05:03.430 に答える