web-dev-qa-db-ja.com

Node.jsでbashコマンドを実行し、終了コードを取得する

Node.jsで次のようにbashコマンドを実行できます。

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

function puts(error, stdout, stderr) { sys.puts(stdout) }
exec("ls -la", function(err, stdout, stderr) {
  console.log(stdout);
});

そのコマンドの終了コード(この例ではls -la)を取得するにはどうすればよいですか?走ってみた

exec("ls -la", function(err, stdout, stderr) {
  exec("echo $?", function(err, stdout, stderr) {
    console.log(stdout);
  });
});

ただし、これは前のコマンドの終了コードに関係なく、常に0を返します。私は何が欠けていますか?

32
mbacvanski

これらの2つのコマンドは、別々のシェルで実行されています。

コードを取得するには、コールバックでerr.codeをチェックできる必要があります。

うまくいかない場合は、exitイベントハンドラーを追加する必要があります

例えば.

dir = exec("ls -la", function(err, stdout, stderr) {
  if (err) {
    // should have err.code here?  
  }
  console.log(stdout);
});

dir.on('exit', function (code) {
  // exit code is code
});
40
Joe

ドキュメントから:

callback関数が提供されている場合、引数(error, stdout, stderr)で呼び出されます。成功すると、errornullになります。エラーの場合、errorはErrorのインスタンスになります。 error.codeプロパティは子プロセスの終了コードになり、error.signalはプロセスを終了したシグナルに設定されます。 0以外の終了コードはエラーと見なされます。

そう:

exec('...', function(error, stdout, stderr) {
  if (error) {
    console.log(error.code);
  }
});

動作するはずです。

6
andlrc

ノードのドキュメントで、コールバック関数に関する次の情報を見つけました。

成功した場合、エラーはnullになります。エラーの場合、エラーはエラーのインスタンスになります。 error.codeプロパティは子プロセスの終了コードになります error.signalはプロセスを終了したシグナルに設定されます。 0以外の終了コードはエラーと見なされます。

1
Borja Tur