はじめに
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オプションとセットで利用することになりそうです。