"трассирующая" версия readlink(1)

Я хотел бы версию "readlink -f", которая обеспечивает трассировку каждого отдельного разрешения символической ссылки, которое он выполняет. Что-то вроде:

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

Я знаю, что использовал эту утилиту в прошлом в Linux, а также помню, что в то время думал, что "название этого инструмента совершенно не интуитивно понятно, и я его забуду". Ну, этот день наступил.

3 ответа

Решение

НИКТО НЕ ВЫИГРЫВАЕТ. Правильный ответ "namei".

Код гольф кого-нибудь?

#!/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);

Вывод не совсем так, как описано, но это понятно. И выкопайте эту ненормальную рекурсивную замену регулярных выражений!

Этот ответ Serverfault (на Bash) может быть полезен (хотя он не претендует на то, что обрабатывает все крайние случаи).

Другие вопросы по тегам