首页 > 解决方案 > 带有异步文件的 Bash 连接器

问题描述

我有一个database/seed.js对数据库执行异步插入的文件。

如果我运行node database/seed.js && mongo < ./database/updateCounter.js,我能保证mongo < ./database/updateCounter.js在异步插入完全完成后运行吗?

这个答案说A && B手段只有在成功的B情况下才会运行A,但成功是如何确定的?

标签: bashcommand-line

解决方案


成功由命令的退出状态决定。

每个 linux 进程在终止时都会返回一个名为exit status的整数。这是您通常return 0在大多数编程语言的语句中看到的数字。

来自bash 手册 3.2.3 命令列表

AND 列表具有以下形式

command1 && command2

当且仅当 command1 返回退出状态为零时,才会执行 command2。

退出状态等于 0 通常意味着成功,非零退出状态意味着失败。就像grep- 退出状态等于 0 意味着在文件/流中找到模式一样,退出状态grep等于 1 意味着在文件/流中没有找到模式。bash 或 shell 内置程序中有两个简单的程序 -truefalse,第一个返回状态 0,另一个返回状态 1。这与编程语言中的布尔值相反 - 通常 true 定义为具有非零值,通常为 1,而 false被定义为零。

在您的问题中,使用了“异步”一词,表示该操作是异步发生的。通常意味着动作已经开始或被请求开始,但可能已经完成也可能没有完成以及结果如何。我不知道它是做什么database/seed.js的以及它是如何工作的 - 检查它并参考它以了解它在哪些条件下设置的退出状态。

但是,如果您运行node database/seed.js && mongo < ./database/updateCounter.js,则“保证”该mongo程序将在且仅当该node程序已终止且退出状态为零时才执行。我引用了“保证”,因为没有人以任何方式向您保证 - bash 是根据GNU 通用公共许可证获得许可的,您可以在许可证中清楚地阅读:

  1. 免责声明。
    在适用法律允许的范围内,本程序不提供任何保证。除非另有说明,否则版权所有者和/或其他方按“原样”提供程序,不提供任何形式的明示或默示保证,包括但不限于对适销性和特定用途适用性的默示保证. 有关程序质量和性能的全部风险由您承担。如果该程序被证明有缺陷,您将承担所有必要的服务、修理或更正的费用。

推荐阅读