41
var sys = require('sys'),
    exec = require('child_process').exec;

exec("cd /home/ubuntu/distro", function(err, stdout, stderr) {
        console.log("cd: " + err + " : "  + stdout);
        exec("pwd", function(err, stdout, stderr) {
            console.log("pwd: " + err + " : " + stdout);
            exec("git status", function(err, stdout, stderr) {
                console.log("git status returned " ); console.log(err);
            })
        })
    })

cd: null :

pwd: null : /

git status returned 
{ [Error: Command failed: fatal: Not a git repository (or any of the parent directories): .git ] killed: false, code: 128, signal: null }

nodeJS execは、「cd」シェルcmdでは機能しません。以下に示すように、pwdは機能し、git statusは機能しようとしていますが、gitディレクトリで実行されていないため失敗しますが、cd cmdは失敗し、他のcmdの実行をさらに正常に停止します。nodeJSシェルとnodeJS+ExpressJSWebサーバーで試してみました。

4

3 に答える 3

78

各コマンドは個別のシェルで実行されるため、最初のコマンドはcdそのシェルプロセスにのみ影響し、その後終了します。特定のディレクトリで実行する場合はgit、Nodeにパスを設定してもらいます。

exec('git status', {cwd: '/home/ubuntu/distro'}, /* ... */);

cwd(現在の作業ディレクトリ)は、で使用できる多くのオプションの1つですexec

于 2013-03-26T05:25:46.033 に答える
6

exec()を複数回呼び出すのではなく。複数のコマンドに対してexec()を1回呼び出します

シェルは実行中cdですが、終了後に各シェルが作業ディレクトリを破棄するだけです。したがって、あなたは正方形の1に戻っています。

あなたの場合、exec()を2回以上呼び出す必要はありません。変数に1ではなく複数の命令が含まれていることを確認できます。この場合、cmdCDが機能します。

var cmd =  `ls
cd foo
ls`

var exec =  require('child_process').exec;

exec(cmd, function(err, stdout, stderr) {
        console.log(stdout);
})

:このコードはLinuxで機能するはずですが、Windowsでは機能しません。こちらをご覧ください

于 2017-05-25T03:07:07.927 に答える
5

動作しています。しかし、それはシェルを捨てています。ノードは、ごとに新しいシェルを作成しますexec

役立つオプションは次のとおりです。http://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback

于 2013-03-26T05:25:56.833 に答える