LinuxとMacOSでリンクを読むオプション(シンボリックリンクではない場合はファイルパスを返します)

LinuxとMacOSでリンクを読むオプション(シンボリックリンクではない場合はファイルパスを返します)

私はこれを持っています:

file_path="/actual/file/path"
read_link="$(readlink "$file_path")"  # just in case it's a symlink

readlinkがシンボリックリンクではない場合は、空の文字列をエコーし​​ますか?シンボリックリンクではない場合、元のパスをエコーするreadlinkオプションはありますか?

答え1

GNU / Linuxシステムの場合、-fフラグはreadlink--canonicalize)です。 «指定された名前を持つすべてのコンポーネントのすべてのシンボリックリンクを繰り返し追跡して正規化します。»あなたのためにそれをします:

touch /tmp/real
ln -s /tmp/real /tmp/link

readlink -f /tmp/real    # → "/tmp/real"
readlink -f /tmp/link    # → "/tmp/real"

Mac OSXシステムでは、これを行うオプションはありません。 «与えられた引数がシンボリックリンクでない場合、readlink何も印刷されず、エラーで終了します。»。

readlinkどちらのシステムも文書と利用可能なすべてのオプションを見つけることができますman readlink

OSXでユニバーサルソリューションに最も近づくことができる機能は次のとおりです。

readlinkorreal() { readlink "$1" || echo "$1"; }

readlinkorreal /tmp/real    # → "/tmp/real"
readlinkorreal /tmp/link    # → "/tmp/real"

答え2

次のファイル構造を考えると:

test/
├── link -> no-link
└── no-link

この-mオプションがうまくいくようです。

florin@debian:/tmp/test$ readlink -m link 
/tmp/test/no-link
florin@debian:/tmp/test$ readlink -m no-link 
/tmp/test/no-link

答え3

readlink -f@roaimaの回答で述べたようにこれを行います。

macOS 12.3では追加されたサポートこのオプションの場合、LinuxとmacOSで利用可能になりました。

関連情報