私はこれを持っています:
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で利用可能になりました。