在 Bash 中调用 Node 运行 JS 文件的数据通信机制

Bash 中调用 Node 运行 JS 文件是一种常见的操作,它允许我们在命令行环境中执行JavaScript 代码。这种机制不仅使得 JavaScript 能够在服务器端运行,还使得脚本化和自动化任务变得更加容易。

这篇文章探讨在 Bash 中调用 Node 运行 JS 文件时如何进行数据通信,即如何在执行之前将参数从 Shell 传递给 JS ,以及如何在 JS 执行完毕后将输出回传给调用它的 Shell

一、从 Shell 传递参数给 JS

Bash 中调用 Node 执行 JS 文件时,我们可以通过命令行参数的方式将数据从 Shell 传递给 JS 。这些参数可以在JS文件中通过process.argv数组获取。process.argv是一个包含命令行参数的数组,其中process.argv[0]是’node’的路径,process.argv[1]JS 文件的路径,之后的元素则是传递给 JS 文件的参数。

下面是一个简单的示例来说明这个过程:

  1. 创建一个名为example.jsJavaScript 文件,内容如下:
// example.js
const args = process.argv.slice(2); // 去除 node 和脚本路径,获取传递的参数
console.log('Received arguments:', args);
  1. Bash 中调用 Node 执行这个 JS 文件,并传递一些参数:
# bash命令
node example.js arg1 arg2 arg3
  1. 执行上述Bash命令后,你将看到以下输出:
# 输出
Received arguments: [ 'arg1', 'arg2', 'arg3' ]

在这个例子中,我们通过在命令行中指定arg1arg2arg3作为参数,并将它们传递给example.js文件。在JS文件中,我们使用process.argv.slice(2)来获取这些参数,并通过console.log将它们打印出来。

二、从 JS 回传输出给 Shell

当JS文件执行完毕后,它的输出(通常是通过console.logprocess.stdout.write等方式产生的)会被直接发送到标准输出流(stdout)。在Bash中,这个标准输出流可以被捕获并用于后续的处理。

以下是如何捕获JS文件输出的示例:

  1. 假设我们有以下的example.js文件:
// example.js
const message = 'Hello from Node.js!';
console.log(message);
  1. 在Bash中调用Node执行这个JS文件,并将输出捕获到一个变量中:
# bash命令
output=$(node example.js)
  1. 随后,你可以在Bash脚本中使用这个output变量:
# bash命令
echo "The output from the script is: $output"

执行上述Bash命令后,你将看到以下输出:

# 输出
The output from the script is: Hello from Node.js!

在这个例子中,JS文件example.js通过console.log输出了一个字符串。当我们在Bash中使用$(node example.js)时,这个输出被捕获并存储在output变量中。然后,我们通过echo命令打印了这个变量的内容。

疑问与解答

那么如果 js 代码在执行过程中调用了多次 console.log 会发生什么样的事情呢?

答案就是,这些所有的输出会被【堆成】一个文件,统一输出,也就是如果你先 console.log(2) 然后 console.log(1) 那么 shell 中接受到的就是:

2
1

此外,如果想要输出数组或者对象的话有该怎么做呢?

这很简单,使用 JSON.stringify() 序列化一下就可以了,相信聪明的你一下子就想到了。

三、总结

Bash 中调用 Node 运行 JS 文件时,数据通信主要通过命令行参数和标准输入输出流来实现。通过命令行参数,我们可以将数据从 Shell 传递给 JS 文件;而通过标准输出流,JS 文件可以将其输出发送回 Shell ,供后续处理使用。这种机制使得 BashNode 之间的交互变得简单而直接,为自动化脚本和服务器端应用的开发提供了极大的便利。

原文链接:https://juejin.cn/post/7350971114971217939 作者:垂慕容

(0)
上一篇 2024年3月28日 上午10:39
下一篇 2024年3月28日 上午10:49

相关推荐

发表回复

登录后才能评论