如何使用 unix 命令将参数动态传递给节点脚本?

Jos*_*ley 5 bash node.js

# index.js
console.log(process.argv) // expect this to print [.., .., '1']

# terminal
$ echo 1 | node index.js // just prints [.., ..]
Run Code Online (Sandbox Code Playgroud)

有什么诀窍?如何通过 unix 命令(如echols、等)从命令行将参数动态传递给节点脚本ps aux

注:我看到,我可以读取UNIX命令的输出使用我的剧本stdin,但我想是真正的参数传递命令行脚本。

Rus*_*nov 6

$ echo 1 | node index.js
Run Code Online (Sandbox Code Playgroud)

在此命令中echo打印1到标准输出,该输出被重定向(通过管道)到node接受index.js参数的命令的标准输入。如果要读取由 打印的字符串echo,请读取标准输入,例如:

var text = '';

process.stdin.setEncoding('utf8');
process.stdin.on('readable', function () {
  var chunk = process.stdin.read();
  if (chunk !== null) {
    text += chunk;
  }
});
process.stdin.on('end', function () {
  console.log(text);
});
Run Code Online (Sandbox Code Playgroud)

如何通过诸如 echo、ls、ps aux 等 Unix 命令从命令行动态地将参数传递给节点脚本?

使用管道,您只能重定向命令的批量输出。您可以使用命令替换将多个命令的输出作为字符串传递,例如:

node index.js --arg1="$(ls -ld /tmp)" --arg2="$(stat -c%a /tmp)"
Run Code Online (Sandbox Code Playgroud)

将命令的输出分配给 shell 变量,以使您的脚本更具可读性:

arg1="$(ls -ld /tmp)"
node index.js --arg1="$arg1"
Run Code Online (Sandbox Code Playgroud)


Jos*_*ley 1

我的一个朋友给我看了这个:

$ node index.js `echo 1 2 3 4`
Run Code Online (Sandbox Code Playgroud)

实际上正是我想要的。这将导致:

// index.js
process.argv // [.., .., '1', '2', '3', '4']
Run Code Online (Sandbox Code Playgroud)

这个和 @RuslanOsmanov 答案之间的区别在于,上面的内容将把输出作为节点进程的所有参数传递,而:

$ node --arg1=`echo 1` --arg2=`echo 2`
Run Code Online (Sandbox Code Playgroud)

每个单独的参数都需要单独的命令。

如果您的文件名包含空格,它将无法按预期工作ls,因为空格字符被视为参数分隔符。

请参阅反引号 - ` - 在命令行调用中具体针对 Git 命令有何作用?有关反勾号使用的更多信息。