Řešení 1:
Stačí použít namei
:
$ namei d
f: d
l d -> c
l c -> b
l b -> a
d a
Řešení 2:
readlink -e <link>
readlink [OPTION]... FILE
- -e, --canonicalize-existující
kanonizovat rekurzivním sledováním každého symbolického odkazu v každé komponentě daného jména, všechny komponenty musí existovat
$ mkdir testlink
$ cd testlink
[email protected]:~/testlink$ ln -s c b
[email protected]:~/testlink$ ln -s b a
[email protected]:~/testlink$ ls -l
total 0
lrwxrwxrwx 1 pjb pjb 1 2010-02-23 08:48 a -> b
lrwxrwxrwx 1 pjb pjb 1 2010-02-23 08:48 b -> c
[email protected]:~/testlink$ echo foo > c
[email protected]:~/testlink$ cat a
foo
[email protected]:~/testlink$ readlink -e a
/home/pjb/testlink/c
poznámka:readlink a sám o sobě vrátí b
poznámka č. 2:společně s find -l může být nástroj pro výpis řetězců snadno napsán v perlu, ale také musí být dostatečně chytrý, aby detekoval smyčky
readlink nevypíše nic, pokud máte smyčku. To je lepší než se zaseknout, myslím.
[email protected]:~/testlink$ ln -sf a c
[email protected]:~/testlink$ ls -l
total 0
lrwxrwxrwx 1 pjb pjb 1 2010-02-23 08:48 a -> b
lrwxrwxrwx 1 pjb pjb 1 2010-02-23 08:48 b -> c
lrwxrwxrwx 1 pjb pjb 1 2010-02-23 09:03 c -> a
[email protected]:~/testlink$ readlink -e a
[email protected]:~/testlink$ # (note: no output)
Řešení 3:
Zde je rekurzivní funkce v Bash:
chain() { export chain; local link target; if [[ -z $chain ]]; then chain="$1"; fi; link=$(stat --printf=%N $1); while [[ $link =~ \-\> ]]; do target="${link##*\`}"; target="${target%\'}"; chain+=" -> $target"; chain "$target"; return; done; echo "$chain"; unset chain; }
Na více řádcích:
chain() {
export chain
local link target
if [[ -z $chain ]]
then
chain="$1"
fi
link=$(stat --printf=%N "$1")
while [[ $link =~ \-\> ]]
do
target="${link##*\`}"
target="${target%\'}"
chain+=" -> $target"
if [[ ! $target =~ / && $1 =~ / ]]
then
target="${1%/*}/$target"
fi
chain "$target"
return
done
echo "$chain"
unset chain
}
Příklady:
$ chain d
d -> c -> b -> a
$ chain c
c -> b -> a
$ chain a
a
Vyžaduje stat(1)
který nemusí být v některých systémech přítomen.
Selže, pokud názvy obsahují zpětné značky, jednoduché uvozovky nebo "->". Uvízne ve smyčce se smyčkami symbolických odkazů (to by se dalo vyřešit pomocí asociativního pole v Bash 4). Exportuje proměnnou nazvanou „řetězec“ bez ohledu na to, zda se již používá.
Mohou s tím být i jiné problémy.
Upravit:
Opraven problém s některými relativními symbolickými odkazy. Některé stále nefungují, ale níže uvedená verze nevyžaduje, aby cíl odkazu existoval.
Přidána verze, která používá readlink:
chain ()
{
export chain;
local target;
if [[ -z $chain ]]; then
chain="$1";
fi;
target=$(readlink "$1");
while [[ $target ]]; do
chain+=" -> $target";
if [[ ! $target =~ / && $1 =~ / ]]
then
target="${1%/*}/$target"
fi
chain "$target";
return;
done;
echo "$chain";
unset chain
}