如何判断Child_Process是否可以运行命令?

"Echo"是可以在终端中运行的有效命令,但"Eches"不是.例如,如果我这样做

const cp = require('child_process')
cp.exec('echo hello')

看起来不错.

不过,如果我这么做了

const cp = require('child_process')
cp.exec('echoes hello') //notice how it is echoes instead of echo

它只会出错,但也许用户有一个程序向终端添加了" echo ",在这种情况下,它将能够运行,但如果它出错,它将退出进程,我将无法判断它是否工作.

有什么办法可以做到这一点吗?提前谢谢你了!

推荐答案

您必须手动循环遍历$PATH个环境中的目录,并对这些目录执行查找. 如果将$PATH设置为/bin:/usr/local/bin,则必须执行

fs.access('/bin/' + comm和, fs.constants.X_OK)

fs.access('/usr/local/bin/' + comm和, fs.constants.X_OK)

解决方案应该是这样的.

const fs = require('fs/promises')
const path = require('path')
const paths = process.env.PATH.split(':')

async function isExecutable(comm和) {
  const cases = []
  for (const p of paths) {
    const bin = path.join(p, comm和)
    cases.push(fs.access(bin, fs.constants.X_OK))
  }
  await Promise.any(cases)
  return comm和
}

const found = (bin) => console.log('found', bin)

const notfound = (errors) => {
  console.log('not found or not executable')
  // console.error(errors)
}

// passes
isExecutable('echo').then(found).catch(notfound)
isExecutable('node').then(found).catch(notfound)

// fails
isExecutable('shhhhhh').then(found).catch(notfound)
isExecutable('echoes').then(found).catch(notfound)

注意:我认为我的解决方案只能在基于NIX的操作系统上运行

Javascript相关问答推荐

我可以使用CSS有效地实现最大宽度=100%和最大高度=100%,而无需父母有明确的/固定的宽度和高度,替代方法吗?

单击子元素时关闭父元素(JS)

在这种情况下,如何 for each 元素添加id?

如何粗体匹配的字母时输入搜索框使用javascript?

在nextjs服务器端api调用中传递认证凭证

如何添加绘图条形图图例单击角形事件

如何通过使用vanilla JS限制字体大小增加或减少两次来改变字体大小

XSLT处理器未运行

提交链接到AJAX数据结果的表单

当使用';字母而不是与';var#39;一起使用时,访问窗口为什么返回未定义的?

从Nextjs中的 Select 项收集值,但当单击以处理时,未发生任何情况

为什么这个.add.group({})在教程中运行得很好,但在我的游戏中就不行了?

Pevent触发material 用户界面数据网格中的自动保存

为什么在运行于<;img>;事件处理程序中的JavaScript中x和y是不可变的?

MUI迷你图:如何将$符号添加到MUI迷你图中的工具提示数据

Firebase函数中的FireStore WHERE子句无法执行

使用Java脚本在div中创建新的span标记

如何在不将整个文件加载到内存的情况下,在Node.js中实现Unix粘贴命令?

如何缩小函数中联合返回类型的范围

JavaScript structuredClone在Chrome/Edge中获得了非法调用,但在NodeJS中没有