我试图弄清楚发生了什么事。大约一个小时前,我正在使用 sudo 编辑 /root 中的一个文件,但是当我保存并退出时,我不小心按下了反斜杠键,结果在我自己的主目录中出现了一个名为“\”的文件,该文件由 root 拥有,具有 640 权限。知道我无法使用给定的名称删除该文件,我尝试用另一个反斜杠转义反斜杠来删除它sudo rm \\
,但这似乎导致系统挂起,此时我惊慌失措并首先尝试了Control-C(当然不起作用),然后Control-Z(按几次组合键后)返回了我的提示。
当我发出原始命令时,确保我位于主目录中后,我决定查找该进程,果然它仍然在列表中,只是暂停了。我必须发出 akill -9
才能最终摆脱它,但我只是想确保它不会在系统上的其他任何地方删除文件。我想不出该命令挂起的另一个原因。
答案1
我假设用户尝试执行sudo rm \
.
输入任何命令,然后\
和Enter都不会执行任何操作。
它不会做任何事情,因为你刚刚转义了换行符。您可能会收到一个类似于 的新提示>
,对吧?这是辅助提示符 ( $PS2
),当 shell 需要更多数据来完成当前命令时,它会使用它。
如果您不小心(或故意)没有关闭报价,您将会得到它,如
$ echo 'hello
>
从那里继续:
$ echo 'hello
> world'
hello
world
通过在行\
尾键入,您可以引入一个续行:
$ ls -l \
>
从那里我们可以继续上一行:
$ ls -l \
> /usr \
> /bin
当您稍后按下换行符时,Enter换行符将转换为空格并执行命令(就像您ls -l /usr /bin
在本例中键入的一样)。
所以,结论是:你输入了
$ sudo rm \
然后你按了回车键。这意味着 shell 还没有执行该命令,因为它仍在等待您结束该命令。此时只需按Ctrl+C取消命令即可。
下一个问题是:如何删除名为 的文件\
? (由 root 拥有)
像这样:
$ sudo rm \\
或者像这样:
$ sudo rm '\'
答案2
该答案解决了标题中以及问题的预渲染文本中关于 running 的问题sudo rm \\
。根据您在 Unix.SE 上实际输入的内容,这似乎就是您运行的内容。但是,根据您观察到的行为,您可能没有实际运行该命令,甚至任何命令,正如库萨拉南达所解释的。所以我建议您也阅读该答案。不管怎样,我认为这两个答案都应该有助于减轻您(也许还有其他读者)对您可能删除了其他文件的担忧。毕竟,部分担忧是不知道到底运行了什么。
我只是想确保它不会在系统上的其他任何地方删除文件
除非你通过了-r
、-R
或 的--recursive
选项,rm
它不会尝试为您指定的每个文件名操作数删除多个文件。rm \\
在 shell 中运行\
作为文件名操作数传递。
有时您可能会传递一些看起来像单个操作数的东西,但它会扩展为多个操作数。例如,如果您使用*
或 等通配字符,则可能会发生这种情况?
。这不是您需要担心的事情\\
。
有时文件名以 和 开头-
,可以解释为选项,这就是为什么某些命令(包括rm
)支持一个--
选项来指示结束选项。但在本例中这也不是问题。\
开头为\
, 不-
。
这是可能的——尽管不太可能,而且也是一个非常糟糕的主意--这rm
可能是一个别名或 shell 函数,它将递归操作的选项传递给而/bin/rm
不仅仅是运行/bin/rm
。如果你这样做了,你可能就会知道。你可能还没有这样做过。不过你可以检查一下。在大多数 Bourne 风格的 shell 中,包括您可能在 RHEL 上使用的 Bash(此外,您标记了巴什),你可以运行:
type rm
这很可能会显示以下之一:
rm is /bin/rm
rm is hashed (/bin/rm)
它还可能显示rm
是一个别名,将-i
或-I
之 类的选项传递给rm
。不过,只要它没有通过-r
、-R
或--recursive
,它就不会尝试删除除您告诉它删除的文件之外的多个文件。
rm
GNU/Linux 系统中提供的版本,包括 Red Hat Enterprise Linux(您标记为雷尔) 是 GNU Coreutils 中的一个。您可以在此处阅读 Coreutilsrm
文档。某些发行版应用下游补丁,但此类补丁不应更改基本操作rm
或添加新方法以意外递归地删除文件。在不同的类 Unix 操作系统中,其行为rm
基本相同,即使您没有说明您正在运行什么操作系统,上述内容也应该适用。
答案3
要删除“棘手”的文件名,请在其前面添加以下前缀./
:
sudo rm ./\\
/
如果预告片在您的根目录中添加了一个有趣的文件(例如名为的文件),也可以使用此方法-rf *:
cd /
sudo rm ./-rf\ \*
如果没有,./
您的所有文件都会消失。