这里 cmp 命令之后的第二个 else 是如何调用的?

这里 cmp 命令之后的第二个 else 是如何调用的?

我不太明白第二个||子句是如何工作的。我知道如果包不同,就会rm -r node_modules执行。然而,我不明白第二个子句是如何||工作的

cmp package.0.json node_modules/package.1.json || { rm -r node_modules || :; npm install; cp package.json node_modules/; }

答案1

cmdA || cmdB代码片段的意思是“运行cmdA,如果失败(退出代码不为 0),则运行cmdB”。

https://stackoverflow.com/q/3224878/4482039:bash 中的冒号:是不执行任何操作的命令。

因此,该rm -r node_modules || :; ...代码片段可以解释为:

  1. 跑步rm -r node_modules
  2. 如果失败(因为node_modules文件/目录不存在,或者我们没有权限),则不执行任何操作(忽略错误)
  3. 运行该线路的剩余部分。

这是一种忽略错误的方法,因为在这种情况下错误是预料之中的。具体来说rm,这种方法比-f标志更安全,因为它不会强制删除rm通常会拒绝删除的文件。

答案2

||仅当左侧退出状态非零时(通常是失败时)才评估右侧。因此,根据这一点,步骤如下:

  1. cmp package.0.json node_modules/package.1.json
  2. 仅当上一个命令失败时才执行后续步骤
  3. 跑步rm -r node_modules
  4. 如果步骤 3 失败,则不执行任何操作(:就像无操作命令)
  5. 跑步npm install
  6. 跑步cp package.json node_modules/

相关内容