
readlink
誰かが次のコマンドオプションを簡単な言語で説明できますか?
-f, --canonicalize
canonicalize by following every symlink in every component of
the given name recursively; all but the last component must
exist
-e, --canonicalize-existing
canonicalize by following every symlink in every component of
the given name recursively, all components must exist
-m, --canonicalize-missing
canonicalize by following every symlink in every component of
the given name recursively, without requirements on components
existence
答え1
これは説明が必要ないようで、あいまいに聞こえる部分はよくわかりません... 例をあげましょう。
--標準化
$ mkdir /tmp/realdir
$ mkdir /tmp/subdir
$ ln -s /tmp/realdir /tmp/subdir/link
$ cd /tmp
$ readlink -f ./subdir/link/nonexistentdir/
/tmp/realdir/nonexistentdir
$ readlink -f ./subdir/link/nonexistentfile.txt
/tmp/realdir/nonexistentfile.txt
オプションが何であれ、次のことをreadlink
行います。 - 相対パスを絶対パスに変換 - シンボリックリンク名を物理パスに変換
上記のように、を使用すると、-f
パスreadlink
の最後の部分(nonexistentfile.txt
ここ)が存在するかどうかは関係ありません。
パスの他の部分が存在しない場合は何も出力されず、readlink
戻りコードは0(エラーが発生したことを意味)とは異なります。望むより:
$ readlink -f /tmp/fakedir/foo.txt
$ echo $?
1
--既存の標準化
同じことをしようとすると-e
:
$ readlink -e ./subdir/link
/tmp/realdir
$ readlink -e ./subdir/link/nonexistentfile.txt
$ echo $?
1
使用時に-e
パスコンポーネントがないとreadlink
何も出力されず、戻りコードは0とは異なります。
--標準化不足
-m
オプションは逆です-e
。パスのコンポーネントが存在することを確認するためのテストは実行されません。
$ readlink -m ./subdir/link/fakedir/fakefile
/tmp/realdir/fakedir/fakefile
$ ln -s /nonexistent /tmp/subdir/brokenlink
$ readlink -m ./subdir/brokenlink/foobar
/nonexistent/foobar
答え2
私を混乱させるには、なぜ誰かに-eと-mオプションが必要ですか?
カーネルソースコード ./scripts/kconfig/merge_config.sh (このスクリプトは設定フラグメント値のリストを取得し、1 つずつマージします):
if [ -z "$KCONFIG_CONFIG" ]; then
if [ "$OUTPUT" != . ]; then
KCONFIG_CONFIG=$(readlink -m -- "$OUTPUT/.config")
else
KCONFIG_CONFIG=.config
fi
fi
KCONFIG_CONFIGは、まだ存在しない可能性がある.configファイルへのパスを受け取ります。