如果第一个失败是真的,我不认为你上面的断言第二个命令会失败。如果mv dir1 dir1_backup
失败,则 dir1 仍然存在,并将mv dir2 dir1
dir2 设为 dir1 的子目录。此外,由于您在第三个命令中传递-f
to rm
,因此它会默默地无法删除不存在的目录。
作为参考,三个 bash 运算符(假设这里是 bash)以及它们的作用:
- ; 只需在第一次退出后执行以下命令,无论退出状态如何。
- && 仅当前一个命令完全退出时(即退出状态为 0)才执行以下命令。
- || 仅当前一个命令不干净地退出时才执行以下命令(即,退出代码非零。)
如果您希望每个命令的执行依赖于前一个命令的成功执行,那么您可能需要考虑以下内容:
mv dir1 dir1_backup && mv dir2 dir1 && rm -rf dir1_backup
如果移动目录是您预期的失败模式,那么在继续删除旧目录内容之前测试移动的返回值或测试预期目录的存在可能是合理的。如果测试失败,则将旧目录内容移回。整体操作将失败,但至少您不会处于无效状态。例如:
mv dir1 dir1_backup && \
mv dir2 dir1 && \
rm -rf dir1_backup || mv dir1_backup dir1
因为我们知道&&
只有前一个命令成功退出才会执行下面的命令,所以只有成功mv dir2 dir1
了才会执行mv dir1 dir1_backup
。
此外,rm -rf dir1_backup
仅当将 dir2 移动到 dir1 成功时才会执行。但是,如果最后一个退出代码(mv dir2 dir1
如果失败则返回的代码)不为零,则||
操作符会导致mv dir1_backup dir1
执行。
希望有帮助!让我知道是否需要澄清。