2017-02-06 30 views
0

JS:如何在外壳执行JavaScript

#!/usr/bin/env node 
const util = require("util"), 
    inquirer = require("inquirer") 
function promptUser() { 
    inquirer.prompt([ 
     { 
      type: "list", 
      name: "scheme", 
      message: "How would you like to build", 
      choices: [ 
       { 
        name: "build develop", 
        value: "develop" 
       }, { 
        name: "build product", 
        value: "product" 
       } 
      ] 
     } 
    ], earlyAnswers => { 
     console.log(earlyAnswers.scheme); 
    }); 
} 
promptUser(); 

会问一个问题,我可以选择一个答案,登录回答,如:

enter image description hereenter image description here

我想给exec这个js in shell:

#!/bin/sh 
echo 123 
a=`node ./test2.js` 

让a = answer,但不能像exec :

enter image description here

我怎么Exec的这个JS?

回答

1

您的javascript实际运行,但你在命令

a=`node ./test2.js` 

原因外壳反引号捕获标准输出,并将其分配给变量a。所有的stdout都被捕获,而不仅仅是最后一行,所以没有任何东西呈现给用户。

解决此问题的一种可能方法是使用node.js进程的退出代码。 这是一个通用脚本,它将在命令行中接受提示选项,并将其退出代码设置为所选内容的从零开始的索引。

#! /usr/bin/env node --harmony_destructuring 
util = require("util"); 
inquirer = require("inquirer"); 

var [program, file, textprompt, ...args] = process.argv 

var choices = []; 
args.forEach(function(E) { 
    var [name, value] = E.split(":",2); 
    choices.push({name: name, value: value}); 
}); 

function promptUser() { 
    inquirer.prompt([ 
     { 
      type: "list", 
      name: "scheme", 
      message: textprompt, 
      choices: choices 
     } 
    ]).then(function(answer) { 
     if (answer && answer.scheme) { 
      position = choices.findIndex(function(E) { return E.value == answer.scheme; }); 
      process.exit(position); 
     } else { 
      process.exit(-1); 
     } 
    }) 
} 
if (choices.length > 0) 
    promptUser(); 

哪位能像这样被使用:

#! /bin/bash 
./test2.js "How would you like to build?" "build develop:develop" "build product:product" 
selected=$? 
case $selected in 
    0) echo "Selected develop";; 
    1) echo "Selected product";; 
    *) echo "Invalid selection";; 
esac