Unix工作目录中的Tilde(〜)


22

因此,我在UNIX环境中工作,我注意到在工作目录(距离UNIX主目录数英里)内,有一个~

现在,过去,我rm -rf ~从工作目录中进行操作,最终彻底删除了我的主目录,并且不得不涉及IT。

我不想再做一次。同时,我想知道

  1. 为什么~在我的工作目录中创建?保存时手指是否滑倒(:w!但是会发生什么:w~?!)

  2. 在签入之前,有一个脚本会查找p4无法识别的其他文件或文件夹,因此~可能会导致问题。那么,如何才能~从工作目录中删除,同时又不删除我的家?

我确实有一个del代替我使用的备份命令rm -rf。它只是将东西放在一个临时位置。我可以使用它并摆脱它~。但是我更想知道为什么会这样,以及如何删除它?


通常,shell用主目录替换路径开头的〜。使用完整路径/home/yourUserName/~访问名为的目录~
jofel 2014年

为了完整起见,〜otheruser / file可用于引用其他用户的主目录。
godlygeek

看起来像个恶作剧!
Xolve 2014年

Answers:


36

要么引用它:

rm -i '~'
rm -i "~"
rm -i \~

或通过路径而不是基本名称来引用它:

rm -i ./~
rm -i /path/to/~

请注意,尽管它是一个看起来很有趣的单字符名称,但从概念上讲,这与您创建SOME$PATH通过

touch 'SOME$PATH'

并尝试通过执行以下操作将其删除:

rm -i SOME$PATH

警告: SOME$PATH 此处的示例未引用 该变量。通常将其用引号引起来'SOME$PATH'

在这两种情况下,shell都会扩展您提供的名称,因此您需要避免这种情况。

另外:请勿rm -rf用于删除文件!整个目的rm -r是告诉rm您可以删除目录。如果您不想在尝试删除文件时意外删除整个目录,请不要习惯-r


12
我刚刚测试过。:w~在vim中确实创建了一个名为的文件~rm ~返回cannot remove /home/seth it is a directoryrm "~"确实删除了文件。仅仅强调一点不会-rf自动通过
赛斯2014年

4
+1,建议您默认省略暴力选项。这类似于kill -9我所见的默认情况。
Celada 2014年

我看到该示例rm -i $FOO出于示例的目的而没有故意引用该变量,但仍然:显示一个包含示例且未引用rm变量作为参数的shell示例是VERY BAD,嗯,抱歉,与上下文无关。我敢肯定,甚至可以证明这一点:)我会添加一些注释-但也许您可以更改示例,有一点吗?
Volker Siegel 2014年

@VolkerSiegel,要点-我参与了您的编辑,但脚注似乎有点过分用力。我还改用了一个不太可能引起问题的变量名-大多数人SOME/bin:/usr/bin在文件系统中的任何地方都没有命名的文件。:)
godlygeek

是的,看起来不错!(我几乎要回答:什么?笨手笨脚的?您在生活中遇到过真正的报价问题吗?;)一般来说,那里出现的错误外壳示例数量多少令人绝望……嘿,这很难即使没有错误的例子也要理解!)
Volker Siegel 2014年

1

代字号在上下文中单独使用时,ls ~会将您的主目录列出为〜,是您的主目录的快捷方式。如果这样做了,ls ~brown那么您将列出Brown的主目录的内容。

除非另有说明,否则VIM将创建已更改文件的备份副本:myFile myFile〜。

此行为很好,因为它创建了一个备份,但是如果您不想要它,则将它添加到您的.vimrc文件中:不设置备份(我刚刚使用进行了访问vi ~/.vimrc)。

当然,正如其他人所说,如果您有一个名为〜的文件,则只需将字符转义为\〜

me 217 % vi this      (saved as :w~)
me 218 % ls
this  ~
me 219 % cat \~
kfdkdfk
me 220 % \rm \~
me 221 % ls
this

0

这可能受类型错误的影响。如果您的TERM=xterm配置类似于我的配置,那么实际上键盘上的每个功能键都会发送转义序列,例如...

infocmp -1 | grep -n \~ | tail -n3
138:    kich1=\E[2~,
141:    knp=\E[6~,
142:    kpp=\E[5~,

在我的机器上,infocmp -1包含~代字号逸出的输出的一半以上-我不知所措,他们大多数都做什么。我确实知道,zsh在大多数情况下,至少实际上吃掉了字符串的转义部分,而只留下了~波浪号

例如,键入echo然后<space>F6<return>版画...

/home/mikeserv

发送的实际转义序列是...

kf6=\E[17~

有趣的是,这些转义序列中还包含>字符。

infocmp -1 | grep \>
is2=\E[!p\E[?3;4l\E[4l\E>,
rmkx=\E[?1l\E>,
rs2=\E[!p\E[?3;4l\E[4l\E>,

这些是常用的转义符-重置和初始化字符串。不难想象,当交互式外壳程序正在等待输入时,键盘掉落或某种形式的按钮粉碎会导致~整个文件系统中随机截断的文件出现。至少,它确实偶尔出现在我的身上。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.