将参数传递给来自stdin的节点脚本

时间:2015-08-24 00:51:15

标签: node.js shell

概述

我想将参数传递给来自stdin的节点脚本。

一般来说,我正在为这样的事情拍摄

nodeScript.js | node {{--attach-args??}} --verbose --dry-run

相同
node nodeScript.js --verbose --dry-run

更多细节

这是一个简单的脚本,用于说明dumpargs.js

console.log("the arguments you passed in were");
console.log(process.argv);
console.log("");

所以你可以:

node dumpargs.js --verbose --dry-run file.txt
[ 'node',
  '/home/bill-murray/Documents/dumpargs.js',
  '--verbose',
  '--dry-run',
  'file.js' ]

现在的问题是,如果该脚本跨越标准输入(例如,通过catcurl

cat dumpars.js | node
the arguments you passed in were
[ 'node' ]

是否有一种向其传递参数的好方法?

  

非节点:使用bash,这次使用dumpargs.sh

echo "the arguments you passed in were"
printf "> $@"
echo 
     

答案看起来像

cat dumpargs.sh | bash -s - "--verbose --dry-run file.txt"
the arguments you passed in were
>  --verbose --dry-run file.txt

2 个答案:

答案 0 :(得分:2)

这不是很好,但有效。

node的调用将启动REPL,因此您的问题应该等同于从终端手动设置/使用argv。尝试做类似的事情:

// argv.js
process.argv[1] = 'asdf';
process.argv[2] = '1234';

并且正在执行cat argv.js dumpargs.js | node

答案 1 :(得分:1)

此用例具有特定的语法。医生说:

   -      Alias for stdin, analogous to the use of - in other command  line  utilities,  meaning
          that  the  script  will  be read from stdin, and the rest of the options are passed to
          that script.

   --     Indicate the end of node options. Pass the rest of the arguments to the script.

          If no script filename or eval/print script is supplied prior to this,  then  the  next
          argument will be used as a script filename.

因此,请执行以下操作:

$ cat script.js | node - args1 args2 ...

例如,这将返回“ hello world”:

$ echo "console.log(process.argv[2], process.argv[3])" | node - hello world