【发布时间】:2020-12-10 11:57:36
【问题描述】:
我有一个任务,我有一个 js 文件,我将使用 nodejs 和 exec() 命令列出我所在的当前目录中的所有文件。我不知道当前目录的名称。
如何在js文件中写exec()和ls命令才能获取文件列表?
谁能告诉我要写那段代码吗?
【问题讨论】:
我有一个任务,我有一个 js 文件,我将使用 nodejs 和 exec() 命令列出我所在的当前目录中的所有文件。我不知道当前目录的名称。
如何在js文件中写exec()和ls命令才能获取文件列表?
谁能告诉我要写那段代码吗?
【问题讨论】:
应该没问题。 模块'util'是promisify exec(),让它返回一个promise,然后你等待它,并且可以使用它。
const util = require('util')
const exec = util.promisify(require('child_process').exec)
const main = async() => {
const { stdout, stderr } = await exec('ls', ['a', '-l' ])
if (stderr) {
console.log(stderr)
}
console.log(`the list of files in this directory is: ${stdout}`)
}
main()
exec(spawn 和 fork 也是如此)是从主节点进程(母进程)派生的进程(子进程),意味着它们运行在一个并发进程上,与母进程分离。这非常有效,因为他们使用处理器的另一个线程。
在 exec 的情况下,它会打开一个新的终端 (tty) 并在其上运行,因此命令 exec('ls', ['a','-l'}) 正在运行 'ls -l' cmd在一个外壳中(我不知道为什么是'a')。因为这个 exec 子进程正在运行到一个 shell 中,所以可以执行任何 shell 命令:我可以做到 await exec('find . -type f | wc -l') 返回文件数,或者 await exec('cat fileName.js')(在终端打印出 fileName 的内容)返回内容的 fileName.js 到标准输出。
Exec 返回一个带有 (err, stdout, stderr) 的回调,为了让这个 sn-p 更清晰,这里util.promisify() 承诺回调,然后我们可以使用 async/await 或 .then() 。抓住()。
我们也可以这样做:
const util = require('util')
const { exec } = require('child_process')
const ex = util.promisify(exec)
const main = async() => {
const { stdout, stderr } = await ex('ls')
if (stderr)...
事实上,基本上这段代码可以这样写
const { exec } = require('child_process');
exec('ls', (error, stdout, stderr) => {
if (error) {
console.error(`exec error: ${error}`);
return;
}
console.log(`stdout: ${stdout}`);
console.error(`stderr: ${stderr}`);
});
查看 nodejs 文档https://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback
希望对你有帮助
【讨论】: