私のユーザーが所有するフォルダにはという/sites/Website
ディレクトリがあります~
。
このディレクトリに入ると、私のホームフォルダcd
にリダイレクトされます。~/
最初はシンボリックリンクだと思いましたが、実際にやってみるとls -al
普通だということに気づきました。私はこれがハードリンクであると仮定します。私は走る:
$ rm -r /sites/Website/~
これにより、実際にホームフォルダが削除され始め、多くのデータが失われました。私は止まったrm
。Ctrlcこのリンクを安全に削除するにはどうすればよいですか?
答え1
~
多くのシェルは、パス名の先頭のスラッシュの前のチルダ()をHOMEディレクトリの絶対パスに展開します。チルダ文字を引用するか、チルダがパス名を開始しないようにすることで、このシェルの拡張を防ぐことができます。
$ echo "$HOME"
/home/idallen
$ echo ~
/home/idallen
$ echo "~"
~
$ echo \~
~
$ echo ./~
./~
Unix自体にはチルダ文字に関する特別なことはないため、上記のいずれかの方法を使用してシェルの拡張を防ぐためにチルダを非表示にすると、チルダというディレクトリを作成できます。
$ 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/~
シェルで前のチルダ文字を非表示にしないと、シェルはそれをHOMEディレクトリに展開します。echo
コマンドラインプレフィックスは、シェルがコマンドラインを実行する前にコマンドラインで実行した操作を示しています。
$ echo cd ~
cd /home/idallen # would go to $HOME directory
$ echo cd ./~
cd ./~ # would go into directory named ~
次のコマンドは、引用されていない先行チルダを拡張するシェルによって非常に異なる効果があるため、チルダを引用する必要があることを発見しました。
$ 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 ~
チルダの先頭に引用符がないパス名のみがホームディレクトリに展開されます。