はじめに
lnコマンドのnオプションについての備忘録。
lnコマンドとは
lnコマンドはLinuxにおいてリンクを張るためのコマンドです。リンクを用いることでファイルやディレクトリに対して別名を付けることができるようになります。
イメージとしてはWindowsにおけるショートカットやMac OSにおけるエイリアスに近いものになります。
リンクにはハードリンクとシンボリックリンクがあります。sオプションを付与するとシンボリックリンクになります。
ハードリンクの使用は限定的です。本記事でもシンボリックリンクを前提に進めていきます。違いについては言及しないので別記事をご参考ください。
nオプションについて
lnにはさまざまなオプションがあるのですが、その中でnオプションについて実例を交えて説明します。
まず、ヘルプを見ると
-n, --no-dereference treat LINK_NAME as a normal file if it is a symbolic link to a directory
「指定したシンボリックリンク(LINK_NAME)が既にディレクトリを参照している場合、LINK_NAMEを通常のファイルとして扱う」と言っています。よくわかりません。
実際にコマンドを打って動作を確かめてみます。
$ mkdir dir1
$ ln -s dir1/ link1
カレントディレクトリにディレクトリ dir1
、シンボリックリンク link1
があり、link1
が dir1
を参照しているような状況です。
lnコマンドの記法はさまざまあるのですが、
ln -s <TARGET> <DIRECTORY>
とすると通常 TARGET
に対するシンボリックリンクが DIRECTORY
の配下に生成されます。
例えば
$ ln -s /etc/os-release link1
$ ls link1
とすると、link1
( dir1
)の中に os-release
という名前のシンボリックリンクが生成されているのが確認できると思います。
一方、nオプションを付けるとどうなるか。
$ ln -snf /etc/os-release link1
$ cat link1
とすると、os-release
の中身が確認できたと思います。つまり、link1
はもはやディレクトリ dir1
を参照しておらず、ファイル /etc/os-release
を参照しています。
これが、LINK_NAMEがもともとディレクトリを参照していても通常のファイルとして扱う、という動作の結果になります。
ちなみに、fオプションは既に存在するリンクを一旦強制的に削除するというオプションで、これがないと失敗します。nオプションはfオプションとセットで利用することになりそうです。