2011-01-07 4 views
2

"readlink -f"のバージョンでは、それが実行するすべてのシンボリックリンク解決のトレースを提供したいと思います。ような何か:readlink(1)の "tracing"バージョン

$ linktrace /usr/lib64/sendmail 
/usr/lib64 -> lib 
/usr/lib/sendmail -> ../sbin/sendmail 
/usr/sbin/sendmail 
$ 

私はLinux上で、過去にこのユーティリティを使用し、また「このツールの名前は完全に直感的であり、私はそれを忘れてしまう」思考時間に覚えている知っています。まあ、その日は到着しました。

+0

あなたが求めているのかどうかは分かりませんが、libc関数 'realpath'と同じ名前のGNUツールがあります。 – asveikau

答えて

1

NOBODY WINS。正解は "namei"です。

0

This Serverfault answer(Bashで)が役立つかもしれませんが(すべてのエッジケースを処理するとは言いませんが)

+0

ベン・ジャクソンの試みと同様、これらのスクリプトはパス内の最後のシンボリックリンクを解決するだけで、以前の "ディレクトリレベル"のシンボリックリンクは解決しません。 "chain/usr/lib64/sendmail"は "/ usr/lib64/sendmail - > ../sbin/sendmail"のみを出力します。 – jonrock

0

コードゴルフ誰ですか? [OK]を

#!/usr/bin/perl 

use File::Spec; 
my $g; 
my $f = shift; 
while (1) { 
    print $f; 
    $g = readlink($f); 
    last unless defined $g; 
    printf " -> %s\n", $g; 
    $f =~ s,/[^/]*$,,; 
    $f = File::Spec->rel2abs($g, $f); 
} 
print "\n"; 

、これはどう:

#!/usr/bin/perl 

use File::Spec; 

sub r { 
    my ($p, $s) = @_; 
    my $l = readlink $p; 
    if ($l) { 
     printf "%s -> %s\n", $p, $l; 
     $p =~ s,/[^/]*$,,; 
     r("",File::Spec->rel2abs($l,$p) . $s) 
    } else { 
     $s =~ s!^(/?[^/]+)(.*)! r($p.$1, $2) !e; 
    } 
} 
r("",shift); 

出力がない、非常に説明したようですが、それは理解できるのです。そしてその狡猾な再帰実行可能な正規表現置換を掘り下げてください!

+0

/usr/lib64 - >/usr/libの手順を処理しません。 – jonrock

+0

私は具体的にコード(rel2abs)を追加してそのケースを処理し、それをテストしました。あなたが何を意味するかわからない... –

+0

/usr/lib64もシンボリックリンクです。/usr/libを指しています。そこから始まるパスを解決するために解決する必要があります。あなたのスクリプトは、シンボリックリンクの終わりを解決します。 "linktrace.BenJ/usr/lib64/sendmail"の最終結果は "/usr/lib64/../sbin/sendmail"です。これは十分ではありません。 – jonrock

関連する問題