2011-01-07 4 views
2

Мне нужна версия «readlink -f», которая обеспечивает следы каждого отдельного разрешения символической ссылки, которое она выполняет. Что-то вроде:«отслеживание» версии readlink (1)

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

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

+0

Не уверен, что это то, о чем вы просите, но есть функция libc 'realpath' и инструмент GNU с тем же именем. – asveikau

ответ

0

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

+0

Подобно попытке Бена Джексона, эти сценарии разрешают только последнюю символическую ссылку в пути, а не какие-либо символические ссылки на уровне каталогов. «chain/usr/lib64/sendmail» печатает только «/ usr/lib64/sendmail -> ../sbin/sendmail», чего недостаточно. – jonrock

0

Code golf any?

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

Ok, как об этом:

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

 Смежные вопросы

  • Нет связанных вопросов^_^