我使用 Bash 4.3.48(1),并在测试 VPS 机器上运行以下命令模式:
rm -rf ${drt}/${pma}*
Run Code Online (Sandbox Code Playgroud)
该命令删除了整个操作系统(Ubuntu)。通过执行可以明显看出这一点cd /
,除了以下错误之外什么也没返回:
bash: cd /: 没有这样的文件或目录
更深入地观察,发生这种情况是因为上面原始命令中的两个变量都没有声明:
我创建了一个名为 的文件~/repoName/assignments_variables.sh
,其中包含导出变量的列表(包括drt
和pma
)。
相反source /etc/bash.bashrc
,我运行了 running /etc/bash.bashrc
,这是错误的,因为该文件仅与当前会话相关(尽管它可用于随后运行自己在子会话中执行数据的文件)。
现在我很清楚错误的路径是问题的一般原因,我想更深入地探讨一下并提出以下问题:
为什么 会rm -rf
忽略错误的变量扩展并继续转到/*
?我知道只有rm -rf
在找到目录时才应该删除它,因此不应依赖于不存在的目录的部分路径(就像导致删除操作系统一样)。我如何改进该命令以涵盖将来可能出现的类似错误路径情况(由于错误的变量扩展)?/*
rm -rf
是否有一些 Bash 指令可以确保 Bash 永远不会扩展空变量(直到我撤消该指令)?
让我强调一下:我通常不仅进行备份,而且进行双重备份。这确实是一个后台有 x3 备份的测试环境。