我不太明白第二个||
子句是如何工作的。我知道如果包不同,就会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 || :; ...
代码片段可以解释为:
- 跑步
rm -r node_modules
。 - 如果失败(因为
node_modules
文件/目录不存在,或者我们没有权限),则不执行任何操作(忽略错误) - 运行该线路的剩余部分。
这是一种忽略错误的方法,因为在这种情况下错误是预料之中的。具体来说rm
,这种方法比-f
标志更安全,因为它不会强制删除rm
通常会拒绝删除的文件。
答案2
||
仅当左侧退出状态非零时(通常是失败时)才评估右侧。因此,根据这一点,步骤如下:
cmp package.0.json node_modules/package.1.json
- 仅当上一个命令失败时才执行后续步骤
- 跑步
rm -r node_modules
- 如果步骤 3 失败,则不执行任何操作(
:
就像无操作命令) - 跑步
npm install
- 跑步
cp package.json node_modules/