shellexp.js 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. "use strict";
  2. var async = require('async');
  3. var exec = require('child_process').exec;
  4. function compact(list) {
  5. return list.filter(function (i) {
  6. if (typeof i.length !== 'undefined') {
  7. return i.length > 0;
  8. }
  9. return !!i;
  10. });
  11. }
  12. function combine(string, repls) {
  13. var pats = string.match(/\$\([^\)]+\)/g);
  14. if (!pats) {
  15. return [string];
  16. }
  17. var res = [];
  18. var pat = pats[0];
  19. var rep = repls[pat];
  20. for (var i = 0; i < rep.length; i++) {
  21. res = res.concat(combine(string.replace(pat, rep[i]), repls));
  22. }
  23. return res;
  24. }
  25. module.exports = function (string, cb) {
  26. var pats = string.match(/\$\([^\)]+\)/g);
  27. if (!pats) {
  28. return cb(null, [string]);
  29. }
  30. var exps = {};
  31. async.forEach(pats, function (pat, cb) {
  32. var cmd = pat.slice(2, -1);
  33. var res = exec(cmd, function (err, stdout, stderr) {
  34. if (err) {
  35. return cb(err);
  36. }
  37. exps[pat] = compact(stdout.toString().split('\n'));
  38. cb(null);
  39. });
  40. }, function (err) {
  41. if (err) {
  42. return cb(err);
  43. }
  44. cb(null, combine(string, exps));
  45. });
  46. };