Node.js child#u过程给出';命令失败';执行grep

Node.js child#u过程给出';命令失败';执行grep,node.js,bash,grep,Node.js,Bash,Grep,我想在节点中使用child\u process搜索是否存在文件: const { exec } = require('child_process'); exec('ls | grep "filename"', (err, result) => {...}) 当文件名存在时,exec结果正常。但是当文件名不存在时,我得到一个错误: 命令失败:ls | grep“filename” 在这种情况下,我如何判断是执行命令时出错,还是因为没有找到结果 编辑 谢谢你的建议,不要用这种方式搜索文件。上

我想在节点中使用
child\u process
搜索是否存在文件:

const { exec } = require('child_process');
exec('ls | grep "filename"', (err, result) => {...})
当文件名存在时,exec结果正常。但是当文件名不存在时,我得到一个错误:

命令失败:ls | grep“filename”

在这种情况下,我如何判断是执行命令时出错,还是因为没有找到结果

编辑


谢谢你的建议,不要用这种方式搜索文件。上面的代码不是实际的代码,只是演示了我在
grep
中遇到的问题。在我的实际案例中,我正在通过搜索输出中的关键字,因此我使用了
exec
tsp-l | grep…

,您可以通过查看回调中
err.code
的值来确定这一点。更多详细信息,请参阅

由于管道中的最后一个命令是
grep
,请参阅
grep
手册页以获取状态代码的完整列表,从而适当地分支逻辑。在您的情况下,
grep
将返回状态代码1,如果未选择任何行(即“没有结果”),因此如果
err.code==1
,则您知道没有匹配的文件

注意:正如@CharlesDuffy所提到的,最好通过
Node.js
实现所需的文件操作。在明确需要
exec
的情况下,利用此答案作为备选方案


顺便说一句,这是一个非常糟糕的方式来判断一个文件是否存在。例如,如果存在
file101
,它将告诉您
file10
存在;容易出现中的所有错误,将忽略点文件,具有不必要的巨大启动成本(至少调用三个单独的UNIX进程),如果读取10000个文件目录,将需要异常长的运行时间。。。如果您尝试检查名为
foo$(rm-rf~)bar的文件,您将度过非常糟糕的一天。有关更好的同步方法,请参阅,或者了解一种不推荐的异步替代方法。顺便说一句,在shell中执行此操作的正确方法是
test-e filename
--no
ls
,no
grep
。但即便如此,将任意/未知的文件名替换为shell解析为代码的字符串也会带来安全风险。@CharlesDuffy–我同意您的首选方法。我的回答只是解释了Node如何在回调中填充错误代码值,以及如何在此值上进行适当的分支。不管是好是坏,我在回答中记下了这一点,以阻止其他人在可能的情况下选择我的回答中的方法。无论是同步还是异步,我都同意高级节点API实现(以任何形式)将比
exec
调用具有更好的准确性和错误处理能力。