

node.js(v4.3.2) の child_process.execSync(command[, options]) の戻り値で stderr
を受け取る方法を教えて下さい。


CC BY-SA 3.0
2016-08-27T11:19:44.557
28527
2016-09-02T04:59:53.803
2016-08-27T14:01:00.573
10166
10166
question
node.js
node.js の execSync の戻り値で stderr を受け取る方法


`stderr`が必要でしたら、例えば`spawnSync`を使う方がよいと思います。

以下は`execSync`で無理をする例です。  
主に、コマンドに`2>&1`などを付けエラー出力を標準出力にもってくる方法です。  
これはシェルの機能ですから、詳しく知りたい場合は`node.js`に関してではなく、シェルやシェルスクリプトに関して調べて下さい。  
sh系のシェルを想定しています。

[code]

    #!/usr/bin/node
    "use strict";
    var child_process = require("child_process");
    
    
    console.log("# 標準出力へのリダイレクトによる取得。標準出力と混ざる");
    // 最後に true コマンドを実行しているのは必ず成功させる為です
    var ls_stdout_and_err = child_process.execSync("ls exist.txt not_exist.txt 2>&1; true");
    console.log({ls_stdout_and_err: ls_stdout_and_err.toString()});
    
    
    console.log("\n# 標準出力へのリダイレクトによる取得。元の標準出力は捨てる");
    var ls_stderr = child_process.execSync(
            "ls exist.txt not_exist.txt 2>&1 >/dev/null; true");
    console.log({ls_stderr: ls_stderr.toString()});
    
    
    console.log("\n# 標準出力とエラーを入れ替えて取得");
    var ls_stderr = child_process.execSync(
            "ls exist.txt not_exist.txt 3>&1 >&2 2>&3; true");
    console.log({ls_stderr: ls_stderr.toString()});
    
    
    console.log("\n# エラーのキャッチによる取得");
    try{
        // 最後に false コマンドを実行しているのは必ず失敗させる為です
        child_process.execSync("ls exist.txt not_exist.txt; false");
    }
    catch(err){
        console.log({
            ls_stdout: err.stdout.toString(),
            ls_stderr: err.stderr.toString(),
        });
    }
    
[/code]

端末で実行すると例えば以下のようになります。コマンドのエラー出力も混じって表示されている事に注意して下さい。

[code]

    # 標準出力へのリダイレクトによる取得。標準出力と混ざる
    { ls_stdout_and_err: 'ls: cannot access \'not_exist.txt\': No such file or directory\nexist.txt\n' }
    
    # 標準出力へのリダイレクトによる取得。元の標準出力は捨てる
    { ls_stderr: 'ls: cannot access \'not_exist.txt\': No such file or directory\n' }
    
    # 標準出力とエラーを入れ替えて取得
    exist.txt
    { ls_stderr: 'ls: cannot access \'not_exist.txt\': No such file or directory\n' }
    
    # エラーのキャッチによる取得
    ls: cannot access 'not_exist.txt': No such file or directory
    { ls_stdout: 'exist.txt\n',
      ls_stderr: 'ls: cannot access \'not_exist.txt\': No such file or directory\n' }
    
[/code]


CC BY-SA 3.0
2016-09-02T04:59:53.803
28644
2016-09-02T04:59:53.803
3054
28527
answer