回答:
別のオプションは、特別に設計されたコマンドを使用することreadlink
です。
例えば
$ readlink -f `command -v php`
/usr/bin/php7.1
-f
GNUへの非ポータブル拡張ですreadlink
。
Mac OS XおよびFreeBSD / NetBSD / etcで。それは:
stat -f %Y <filename>
より一般的には、解決策は次のとおりです(stat --printf =%Nは奇妙な引用符を使用します):
ls -l b | sed -e 's/.* -> //'
例:
# ln -s a b
# stat -f %Y b
a
別の方法は次のとおりです。
# find b -maxdepth 0 -printf %l
a#
最後の行は改行がないためマングルされますが、変数の結果が必要な場合はそれで問題ありません。
# f=$(find b -maxdepth 0 -printf %l)
# echo $f
a
これ-maxdepth
はfind
、b
たまたまディレクトリである場合にディレクトリに降りることを防ぐために必要です。
stat --printf='%N\n'
まさに私が望むものです、奇妙な引用は私を気にしません、それらは同じ引用rmと
link -> dest
、出力に出力されるため、これは明らかに移植性がありません。それはGNUののfindutilsでだかそうでない場合のfind(1)ソリューションは...チェックする必要があります
echo $f
確かにあなたが期待するものを生成しないときにシンボリックリンクポイント/*
(はい、それは可能です)
移植性:ヒューリスティックを使用してls -l出力を解析するか、または perl -le 'print readlink("some-file")'
一部のシステムにはreadlink
コマンドがあり、一部のシステムには-f
絶対パスを取得するオプションがあります。
/ システムコールのstat
ラッパーとして、コマンドのさまざまな実装があります。GNUのものはその点では有用ではありませんが、zshの組み込みのものはより有用です。stat
lstat
zmodload zsh/stat
stat +link the-link
引き続きzshを使用すると、:A
修飾子(変数展開、履歴展開、グロビングに適用)を使用してファイルの絶対パスを取得できます(すべてのsymlinkコンポーネントを削除します)。
~$ gstat -c %N b
`b' -> `a'
~$ var=b
~$ echo $var:A
/home/me/a
~$ echo b(:A)
/home/me/a
~$ echo ?(@:A)
/home/me/a
コマンドreadlink
やstat
コマンドがないのにPython 2.xがあるシステムでは、短いスクリプトを使用しています:
#!/usr/bin/env python
import os, sys
if __name__ == "__main__":
src = sys.argv[1]
target = os.readlink(src)
if not os.path.isabs(target):
target = os.path.abspath(os.path.join(os.path.dirname(src), target))
print target
readlink -f
これとは異なり、シンボリックリンクのレベルは1つだけであることに注意してください。
realpath
coreutils
パッケージのコマンド、
readlink
コマンドのマニュアルページにリンクされています。
例えば:
realpath /bin/python
出力
/usr/bin/python2.7
私のマシンで。
readlink -f
、最後のシンボリックリンクターゲットを知りたい場合に使用します。