在我的用户拥有的文件夹中,/sites/Website
有一个名为 的目录~
。
当我cd
进入此目录时,我会被重定向到~/
我的主文件夹。
起初我以为这是一个符号链接,但实际操作后ls -al
发现它很普通。我假设这是一个硬链接。我跑:
$ rm -r /sites/Website/~
这实际上开始删除我的主文件夹,并且丢失了很多数据。我停了rm
下来Ctrlc。我怎样才能安全地删除这个链接?
答案1
~
许多 shell将路径名开头的斜线之前的前导波形符 ( ) 扩展为 HOME 目录的绝对路径。您可以通过引用波浪号字符或确保波浪号不以路径名开头来防止此 shell 扩展:
$ echo "$HOME"
/home/idallen
$ echo ~
/home/idallen
$ echo "~"
~
$ echo \~
~
$ echo ./~
./~
对于 Unix 本身来说,波浪号字符没有什么特别之处,因此您可以创建一个名为 波浪号 的目录,前提是您使用上述任何方法隐藏波浪号以防止 shell 扩展:
$ mkdir "~"
$ ls -ld '~'
drwxr-xr-x 2 idallen idallen 40 Oct 22 08:45 ~
$ ls -ld \~
drwxr-xr-x 2 idallen idallen 40 Oct 22 08:45 ~
$ ls -ld ./~
drwxr-xr-x 2 idallen idallen 40 Oct 22 08:45 ~
$ ls -ld /tmp/idallen/~
drwxr-xr-x 2 idallen idallen 40 Oct 22 08:45 /tmp/idallen/~
如果您没有在 shell 中隐藏前导波浪号字符,则 shell 会将其扩展为您的 HOME 目录。在命令行前面添加echo
命令可以显示 shell 在执行之前对命令行执行的操作:
$ echo cd ~
cd /home/idallen # would go to $HOME directory
$ echo cd ./~
cd ./~ # would go into directory named ~
您已经发现需要引用波浪号,因为下面的命令会产生非常不同的效果,具体取决于您的 shell 扩展未加引号的前导波浪号:
$ echo rm -r ~
rm -r /home/idallen # would remove the $HOME directory
$ echo rm -r "~"
rm -r ~ # would remove the directory named ~
$ echo rm -r ./~
rm -r ./~ # would remove the directory named ~
$ echo rm -r /tmp/idallen/~
rm -r /tmp/idallen/~ # would remove the directory named ~
只有路径名开头不带引号的波形符才会扩展为您的主目录。