在 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.js的 JavaScript 文件,内容如下:
javascript 复制代码
// example.js
const args = process.argv.slice(2); // 去除 node 和脚本路径,获取传递的参数
console.log('Received arguments:', args);
  1. 在 Bash 中调用 Node 执行这个 JS 文件,并传递一些参数:
bash 复制代码
# bash命令
node example.js arg1 arg2 arg3
  1. 执行上述Bash命令后,你将看到以下输出:
bash 复制代码
# 输出
Received arguments: [ 'arg1', 'arg2', 'arg3' ]

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

二、从 JS 回传输出给 Shell

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

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

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

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

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 中接受到的就是:

txt 复制代码
2
1

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

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

三、总结

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

相关推荐
xbzb3 天前
Shell 函数:语法、传参与递归调用一次讲透
shell·递归·函数·调用·传参·递归调用
东鹏特饮5 天前
15个实用Linux运维脚本
linux·运维·shell·脚本·redhat·常用生产脚本
Zoom5 天前
【开源】7 天,我用 Rust 复刻了 FinalShell!Rhost v1.0.0 发布
rust·electron·shell
Lsetea14 天前
OpenSSL s_client退出码为0却证书验证失败:严格校验与Shell管道排查
https·shell·ssl证书·openssl·tls
fox_charon15 天前
Windows 下 CLI 参数的引号陷阱:为什么 --resume 'uuid' 会失败
windows·shell·cmd·cli·引号
吴声子夜歌24 天前
Shell编程实例——编写安全的shell脚本(二)
linux·运维·shell
吴声子夜歌1 个月前
Shell编程实例——内务及管理任务(一)
linux·运维·shell
吴声子夜歌1 个月前
Shell编程实例——高级脚本编程(一)
linux·运维·网络·shell
吴声子夜歌1 个月前
Shell编程实例——bash的配置与自定义(二)
linux·运维·shell
吴声子夜歌1 个月前
Shell编程实例——与解析相关的任务(二)
linux·运维·shell