web-dev-qa-db-ja.com

nodeJS execが「cd」シェルコマンドで機能しない

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」シェルコマンドでは機能しません。以下に示すように、pwdは機能しますが、gitステータスは機能しますが、gitディレクトリで実行されないため失敗しますが、cd cmdは失敗し、他のcmdの実行はそれ以上成功しません。 nodeJSシェルとnodeJS + ExpressJSウェブサーバーで試してみました。

29
user1447121

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

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

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

50
icktoofay

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

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

4
Frambot

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

シェルIS実行中cdですが、各シェルは、終了後に作業ディレクトリを破棄するだけです。したがって、元の状態に戻ります。

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

var cmd =  `ls
cd foo
ls`

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

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

:このコードはLinuxでは機能しますが、Windowsでは機能しません。 こちら を参照

0
Cameron