
私は過去20年間に完全に理解したことがなかったことを認めるいくつかの基本的なGNU / Linuxコマンドの理解を更新しています。
$ man ln
部分的には次のように言います。
-n, --no-dereference
treat LINK_NAME as a normal file if it is a symbolic link to a directory
これをよりよく理解するために、次のように分類します。
$ mkdir dir1
$ ln -vs dir1 dir2
'dir2' -> 'dir1'
$ mkdir dir3; touch dir3/xx
$ tree -F
.
├── dir1/
├── dir2 -> dir1/
└── dir3/
└── xx
# Now to test -n, first as a hard link
$ ln -vn dir3/xx dir2
ln: failed to create hard link 'dir2': File exists
# and second as a symbolic link
$ ln -vsn dir3/xx dir2
ln: failed to create symbolic link 'dir2': File exists
# ??? why do these both fail ???
要約の最初のコマンド形式のみ、次の構文を使用して「LINK_NAME」を呼び出します。
ln [OPTION]... [-T] TARGET LINK_NAME
したがって、これは手段-n
と--no-dereference
オプションただ, の最初の命令型に関連付けられていますln
(他の3つの命令型は該当しません)。
私の例では:
これターゲットはいdir3/xx
、
そしてLINK_NAMEdir2
(「ディレクトリへのシンボリックリンク」)。
マニュアルによるとLINK_NAMEの場合(つまり、これが私たちが作りたいリンクの名前であることを覚えておいてください)はいディレクトリへのシンボリックリンク'...
...それからこのシンボリックリンクを」一般文書'。
私は何を見逃していますか?
答え1
そうでない場合、-n
両方のコマンドはln
内部的にリンクを生成しますdir2
。リンクがLINK_NAME
存在し、ディレクトリまたはディレクトリへのシンボリックリンクの場合は、ディレクトリ内にリンクを作成します(可能な場合)。
これが-n
ここで変更されたものです。ディレクトリln
として処理されません(シンボリックリンクの場合)。すでに存在するLINK_NAME
ので失敗します。追加すると、既存のシンボリックリンクが置き換えられます。LINK_NAME
ln
-f
ln -nsf dir3 dir2
dir2
内部的にリンクを作成する代わりに置き換えますdir2
。