在 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 文件,内容如下:
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' ]

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

二、从 JS 回传输出给 Shell

当JS文件执行完毕后,它的输出(通常是通过console.logprocess.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 ,供后续处理使用。这种机制使得 BashNode 之间的交互变得简单而直接,为自动化脚本和服务器端应用的开发提供了极大的便利。

相关推荐
Selina K5 小时前
shell脚本知识点记录
笔记·shell
Dangks3 天前
[运维] 服务器本地网络可用性检查脚本
linux·运维·服务器·shell·network·系统工具
DreamADream4 天前
Shell编程中关于用户操作报错`用户无法登录`
shell
江上清风山间明月8 天前
shell脚本编写注意细节 ==、=等的区别
bash·shell·注意·相等·细节·==·=
188_djh12 天前
# linux从入门到精通-从基础学起,逐步提升,探索linux奥秘(十六)--shell
linux·运维·bash·shell·shell入门·shell变量·linux入门到精通
RamboPan12 天前
Mac 使用脚本批量导入 Apple 歌曲
macos·自动化·shell·apple·script
I'm Jie13 天前
一站式学习 Shell 脚本语法与编程技巧,踏出自动化的第一步
linux·ssh·shell·shell脚本·shell编程
rainsc16 天前
当多核变单核:破解CPU核心神秘失踪的终极指南!
服务器·shell
一丝晨光16 天前
编程语言支持中文变量吗?三字符组是什么来源?为什么结构体要考虑对齐?如何确定语言使用的地址是不是物理地址?用户态应用程序如何获取变量的物理地址?
java·linux·c++·c·shell·结构体·虚拟地址
188_djh16 天前
# linux从入门到精通-从基础学起,逐步提升,探索linux奥秘(十七)--shell运算符
linux·运维·bash·shell·shell脚本附带参数·shell运算符·shell文件测试运算符