16

しばらくの間、私は今のところうまくいかない何かに到達しようとしています.

nodejs では、対話型の sh-command を実行し、コマンドが終了した後に sh-command の出力を処理するのが好きです。私は、インタラクティブなシェル コマンドの実行をラップし、シェル コマンドの出力を返す生成可能な生成関数を作成するのが好きです。

アプローチ 1: shelljs

  • shelljs
  • 私はshelljsである程度成功しましたが、ある時点でそれ以上実行できなくなりました。
  • 質問 1: stdio を継承して shelljs 関数を生成できるようになるまで shelljs を取得することは可能ですか?

アプローチ 2: child_process.spawnSync

  • child_process.spawnSync
  • ついに私は child_process.spawnSync を発見し、少なくともインタラクティブなsh-commandsを問題なく実行できることに満足していましたoptions: { stdio: 'inherit' }
  • しかし、child_process.spawnSync の出力を取り戻す方法がわかりませんでした。
  • 質問 2: spawnSync を、child_process の出力を返すジェネレーター関数にラップする方法は?

アプローチ 3: co-child-process

  • co-child-processも試しました。
  • 実行されているようですが、標準入出力とは対話的ではありません。これに関して問題があります、私は本当に理解していません。
  • 質問 3: 誰かが私に説明したり、co-child-process が stdio inherit でどのように機能するかの例を投稿したりできますか?

アプローチ 4: bluebird で child_process.spawn() を約束する

  • child_process.spawn() が約束されている場合、私はブルーバードで問題を開きました

だから私の質問です。シェル コマンドの出力を返す生成可能なジェネレーター関数でラップできる対話型シェル コマンドを実行する方法の例を投稿してもらえますか? 私は新しいアプローチに対してオープンです。

フォークして貢献できるgithubで利用可能な npm モジュールを作成しました。

事前にt​​hx。

4

1 に答える 1

29

v5.4.1 で動作する以下を見つけました。ドキュメントNodeJS Child Processでは、デフォルトの'buffer'を持つオプションencodingについて言及しています。このオプションを'utf8'に設定すると、バッファの代わりに結果を含む文字列が返されます。spawnSync は同期的であり、コマンドが完了するまで実行をブロックするため、spawnSync から文字列を取得できます。「ls -l /usr」コマンドを実行し、出力を文字列オブジェクトとして取得するスクリプトの実例を次に示します。

#!/usr/bin/env node

var cp = require('child_process');

var ls = cp.spawnSync('ls', ['-l', '/usr'], { encoding : 'utf8' });
// uncomment the following if you want to see everything returned by the spawnSync command
// console.log('ls: ' , ls);
console.log('stdout here: \n' + ls.stdout);

実行すると、次のようになります。

stdout here:
total 68
drwxr-xr-x   2 root root 36864 Jan 20 11:47 bin
drwxr-xr-x   2 root root  4096 Apr 10  2014 games
drwxr-xr-x  34 root root  4096 Jan 20 11:47 include
drwxr-xr-x  60 root root  4096 Jan 20 11:47 lib
drwxr-xr-x  10 root root  4096 Jan  4 20:54 local
drwxr-xr-x   2 root root  4096 Jan  6 01:30 sbin
drwxr-xr-x 110 root root  4096 Jan 20 11:47 share
drwxr-xr-x   6 root root  4096 Jan  6 00:34 src

ドキュメントは、 stdoutに加えて、オブジェクトに何を戻すことができるかを示しています。返されたオブジェクトのすべてのプロパティを確認したい場合は、console.log のコメントを外してください (警告: たくさんのものがあります :) )。

于 2016-01-20T19:55:42.420 に答える