readlinkのオプション

前回coreutilsのコマンド一覧を抽出した時に見つけた、使ったことがないコマンド使ってみます。readlinkです。

helpを見るとこのようなオプションがあります。

takk@deb9:~$ readlink --help
使用法: readlink [OPTION]... FILE...
シンボリックリンクの値または正規化されたファイル名を表示します。

  -f, --canonicalize            与えられた名前の要素中に存在するシンボリックリンクを
                                再帰的に全て辿る。最後の要素以外は存在しなければいけ
                                ない
  -e, --canonicalize-existing   与えられた名前の要素中に存在するシンボリックリンクを
                                再帰的に全て辿る。最後の要素も含めて全て存在しなけれ
                                ばいけない
  -m, --canonicalize-missing    canonicalize by following every symlink in
                                every component of the given name recursively,
                                without requirements on components existence
  -n, --no-newline              do not output the trailing delimiter
  -q, --quiet,
  -s, --silent                  suppress most error messages (on by default)
  -v, --verbose                 report error messages
  -z, --zero                    end each output line with NUL, not newline
      --help     この使い方を表示して終了する
      --version  バージョン情報を表示して終了する

日本語と英語混在してます。

さて、使います。適当に実験用ディレクトリを作り、シンボリックリンクを作ります。

takk@deb9:~$ mkdir tmp;cd tmp
takk@deb9:~/tmp$ mkdir a
takk@deb9:~/tmp$ ln -s a b
takk@deb9:~/tmp$ ln -s c d
takk@deb9:~/tmp$ ln -s b c
takk@deb9:~/tmp$ ls -l
合計 4
drwxr-xr-x 2 takk takk 4096  3月 31 20:59 a
lrwxrwxrwx 1 takk takk    1  3月 31 20:59 b -> a
lrwxrwxrwx 1 takk takk    1  3月 31 20:59 c -> b
lrwxrwxrwx 1 takk takk    1  3月 31 20:59 d -> c
takk@deb9:~/tmp$ 

a->b->c->d
というように、ファイルがリンクしてます。つまり、ファイルdは、ファイルaです。

さて、オプションなしでreadlink dをすると、

takk@deb9:~/tmp$ readlink d
c
takk@deb9:~/tmp$ 

なるほど、リンク元が分かるんですね。

次に各オプションを使ってみます。

takk@deb9:~/tmp$ readlink -f d
/home/takk/tmp/a
takk@deb9:~/tmp$ readlink -e d
/home/takk/tmp/a
takk@deb9:~/tmp$ readlink -m d
/home/takk/tmp/a
takk@deb9:~/tmp$ 

全部同じです。たまたま実体があるので、違いがなかったのでしょうか。

ファイルbを削除して、リンクを切ってみます。

takk@deb9:~/tmp$ rm b
takk@deb9:~/tmp$ ls -l
合計 4
drwxr-xr-x 2 takk takk 4096  3月 31 20:59 a
lrwxrwxrwx 1 takk takk    1  3月 31 20:59 c -> b
lrwxrwxrwx 1 takk takk    1  3月 31 20:59 d -> c
takk@deb9:~/tmp$ 

さて、同じように各オプションを確認。

takk@deb9:~/tmp$ readlink -f d
/home/takk/tmp/b
takk@deb9:~/tmp$ readlink -e d
takk@deb9:~/tmp$ readlink -m d
/home/takk/tmp/b
takk@deb9:~/tmp$ 

-eオプションの場合は、何も表示されませんでした。
シンボリックリンクの大元がないと表示しないってことですね。
-fと-mオプションは、切れてる部分まで表示してます。
もう少し探ってみます。ファイルcも削除してみます。

takk@deb9:~/tmp$ rm c
takk@deb9:~/tmp$ ls -l
合計 4
drwxr-xr-x 2 takk takk 4096  3月 31 20:59 a
lrwxrwxrwx 1 takk takk    1  3月 31 20:59 d -> c
takk@deb9:~/tmp$ 

同じように確認。

takk@deb9:~/tmp$ readlink -f d
/home/takk/tmp/c
takk@deb9:~/tmp$ readlink -e d
takk@deb9:~/tmp$ readlink -m d
/home/takk/tmp/c
takk@deb9:~/tmp$ 

違いが分かりません。

もう、存在しないファイルで試してみます。

takk@deb9:~/tmp$ readlink -f nothing
/home/takk/tmp/nothing
takk@deb9:~/tmp$ readlink -e nothing
takk@deb9:~/tmp$ readlink -m nothing
/home/takk/tmp/nothing
takk@deb9:~/tmp$ 

何でしょうか。-fも -mも想定外なことをしてくれてます。
ということで、今のところは、-fと-mオプションに使い道が見つかりません。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA