Solusi 1:
Cukup gunakan namei :
$ namei d
f: d
l d -> c
l c -> b
l b -> a
d a
Solusi 2:
readlink -e <link>
tautan baca [OPSI]... FILE
- -e, --canonicalize-ada
kanonikalisasi dengan mengikuti setiap symlink di setiap komponen dari nama yang diberikan secara rekursif, semua komponen harus ada
$ mkdir testlink
$ cd testlink
example@unixlinux.online:~/testlink$ ln -s c b
example@unixlinux.online:~/testlink$ ln -s b a
example@unixlinux.online:~/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
example@unixlinux.online:~/testlink$ echo foo > c
example@unixlinux.online:~/testlink$ cat a
foo
example@unixlinux.online:~/testlink$ readlink -e a
/home/pjb/testlink/c
catatan:readlink a dengan sendirinya mengembalikan b
catatan #2:bersama dengan find -l, utilitas untuk membuat daftar rantai dapat dengan mudah ditulis dalam perl, tetapi juga harus cukup pintar untuk mendeteksi loop
readlink tidak akan menampilkan apa pun jika Anda memiliki loop. Ini lebih baik daripada terjebak, kurasa.
example@unixlinux.online:~/testlink$ ln -sf a c
example@unixlinux.online:~/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
example@unixlinux.online:~/testlink$ readlink -e a
example@unixlinux.online:~/testlink$ # (note: no output)
Solusi 3:
Berikut adalah fungsi rekursif di 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; }
Di beberapa baris:
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
}
Contoh:
$ chain d
d -> c -> b -> a
$ chain c
c -> b -> a
$ chain a
a
Ini membutuhkan stat(1) yang mungkin tidak ada di beberapa sistem.
Itu akan gagal jika nama mengandung backticks, tanda kutip tunggal, atau "->". Itu macet dalam satu lingkaran dengan loop symlink (ini bisa diselesaikan dengan menggunakan array asosiatif di Bash 4). Itu mengekspor variabel yang disebut "rantai" tanpa memperhatikan apakah itu sudah digunakan.
Mungkin ada masalah lain dengannya.
Edit:
Memperbaiki masalah dengan beberapa symlink relatif. Beberapa masih tidak berfungsi, tetapi versi di bawah ini tidak memerlukan target tautan untuk tetap ada.
Menambahkan versi yang menggunakan tautan baca:
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
}