web-dev-qa-db-ja.com

ln -sが、既存のシンボリックリンクされたディレクトリへのシンボリックリンクを作成するときに失敗することを要求しないのはなぜですか?

実行時(Linuxのさまざまなubuntuバリエーション):

>ln -s dir_1 symlink_dir
>ln -s dir_2 symlink_dir

失敗したとは言わずに失敗します。しかし、代わりにファイルに対して同じことを行う場合、またはオプションにvを追加すると、失敗したことがわかります。

>ln -s file_1 symlinkg_file
>ln -s file_2 symlinkg_file

または

>ln -sv dir_1 symlink_dir
>ln -sv dir_2 symlink_dir

エラーメッセージで失敗します:

ln: failed to create symbolic link

私にとって、これは非常に奇妙な行動のように思われますか?これには理由がありますか?

2
giZm0

実際には失敗しません。それはあなたのリンクを作成しますinside指定されたディレクトリ:

% mkdir dir_1 dir_2
% ln -s dir_1 symlink_dir
% ln -s dir_2 symlink_dir
% ls -l
total 0
drwxr-xr-x 2 user group 60 Oct 16 12:47 dir_1
drwxr-xr-x 2 user group 40 Oct 16 12:47 dir_2
lrwxrwxrwx 1 user group  5 Oct 16 12:47 symlink_dir -> dir_1
% ls -l dir_1
total 0
lrwxrwxrwx 1 user group  5 Oct 16 12:47 dir_2 -> dir_2

この動作については、マンページで説明されています。

 ln [OPTION]... TARGET... DIRECTORY     (3rd form)
 ...
 In the 3rd and 4th forms, create links to each TARGET in DIRECTORY.

ただし、このリンクは正しく設定されていないため、dir_2にリンクバックできません。ただし、これも予想される動作であり、失敗することを意図したものではありません。マンページから:

シンボリックリンクは任意のテキストを保持できます。後で解決されると、相対リンクはその親ディレクトリに関連して解釈されます。

ちなみに、-svでも同じように動作します。 lnの別の実装を使用している可能性があります。 -Tを使用していませんか?多分それはあなたの~/.bashrc/~/.zshrc/etcに設定されています。 which lnをお試しください。

3
dset0x