【问题标题】:Removing a folder called ~ [duplicate]删除一个名为 ~ [重复]
【发布时间】:2019-01-20 05:48:50
【问题描述】:

我的 bash 脚本中有一个错误,它创建了一个名为

的文件夹
~

无论如何,这导致我遇到另一个问题,即执行以下命令:

rm -fr ~

ooopsss 删除了我的主文件夹...

所以我的问题是:

为什么 rm 对别名起作用,而不是对我所在位置列出的实际文件夹起作用?

您可以通过以下方式重现它:

cd /tmp/
mkdir "~"
which rm ~

现在你会看到哪个rm的输出~ 指向实际的主文件夹,而不是在 tmp 中创建的 ~

【问题讨论】:

  • 你试过用单引号括起来吗?
  • 从现在开始我将在指向路径或添加 ./ 时开始使用引号。/ 很高兴它发生了,我真的相信一些最大的错误是最大的教训,我很高兴有备份 :)

标签: bash rm


【解决方案1】:

~ 被 shell 扩展为主目录名称​​之前 rm 被调用,rm 程序不知道它。

可以通过将它们括在引号中来抑制这样的魔术字符的扩展:

$ echo ~
/Users/fredbloggs
$ echo '~'
~

【讨论】:

  • so rm / 任何其他带引号 '~' 的 sh 命令将使 bash 使用实际的字符串并且它会忽略别名?
  • 是的,但是调用 ~ 别名并不准确,因为别名是特定的 shell 构造。这称为 Tilde Expansion,在 man bash 中搜索。
【解决方案2】:
rm -R ./~

这将使它在当前目录中查找 ~。如果你跑

rm -rf ~

你正在删除原来的〜所以你需要间接使用./~

这是由于特殊字符的扩展而发生的

【讨论】:

  • 因此将 ./ 添加到 ~ 将导致 bash 忽略 ~ 别名,因为它现在是不同的字符串
  • 没错。如果你想使用 ~ 你可以在引号中使用它作为另一个答案解释,这样shell就不会扩展特殊字符
猜你喜欢
  • 2021-11-10
  • 1970-01-01
  • 2017-03-13
  • 2011-02-12
  • 2022-07-10
  • 2016-04-09
  • 2021-04-16
  • 1970-01-01
  • 2016-09-18
相关资源
最近更新 更多