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ウェブサーバーで試してみました。
各コマンドは個別のシェルで実行されるため、最初のcd
はそのシェルプロセスにのみ影響し、その後シェルは終了します。特定のディレクトリでgit
を実行する場合は、Nodeでパスを設定します。
exec('git status', {cwd: '/home/ubuntu/distro'}, /* ... */);
cwd
(現在の作業ディレクトリ)は exec
で使用できる多くのオプションの1つです。
動いています。しかし、それはシェルを捨てます。 Nodeは、exec
ごとに新しいシェルを作成します。
役立つオプションは次のとおりです。 http://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback
シェル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では機能しません。 こちら を参照