"трассирующая" версия readlink(1)
Я хотел бы версию "readlink -f", которая обеспечивает трассировку каждого отдельного разрешения символической ссылки, которое он выполняет. Что-то вроде:
$ linktrace /usr/lib64/sendmail
/usr/lib64 -> lib
/usr/lib/sendmail -> ../sbin/sendmail
/usr/sbin/sendmail
$
Я знаю, что использовал эту утилиту в прошлом в Linux, а также помню, что в то время думал, что "название этого инструмента совершенно не интуитивно понятно, и я его забуду". Ну, этот день наступил.
3 ответа
Решение
Код гольф кого-нибудь?
#!/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) может быть полезен (хотя он не претендует на то, что обрабатывает все крайние случаи).