在 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 文件的参数。
下面是一个简单的示例来说明这个过程:
- 创建一个名为
example.js的JavaScript文件,内容如下:
javascript
// example.js
const args = process.argv.slice(2); // 去除 node 和脚本路径,获取传递的参数
console.log('Received arguments:', args);
- 在
Bash中调用Node执行这个JS文件,并传递一些参数:
bash
# bash命令
node example.js arg1 arg2 arg3
- 执行上述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文件输出的示例:
- 假设我们有以下的
example.js文件:
javascript
// example.js
const message = 'Hello from Node.js!';
console.log(message);
- 在Bash中调用Node执行这个JS文件,并将输出捕获到一个变量中:
bash
# bash命令
output=$(node example.js)
- 随后,你可以在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 之间的交互变得简单而直接,为自动化脚本和服务器端应用的开发提供了极大的便利。