Bu örnek verilen:
mkdir a
ln -s a b
ln -s b c
ln -s c d
Eğer uygularsam:
ls -l d
Gösterecek:
d -> c
Bunun yerine ls
başka bir linux komutunun gösterilmesi için bir yol var mı d -> c -> b -> a
?
Bu örnek verilen:
mkdir a
ln -s a b
ln -s b c
ln -s c d
Eğer uygularsam:
ls -l d
Gösterecek:
d -> c
Bunun yerine ls
başka bir linux komutunun gösterilmesi için bir yol var mı d -> c -> b -> a
?
Yanıtlar:
Sadece kullan namei
:
$ namei d
f: d
l d -> c
l c -> b
l b -> a
d a
ls
. Teşekkürler!
readlink -e <link>
readlink [SEÇENEK] ... DOSYA
- -e, - canonicalize-var
verilen adın her bileşenindeki her sembolik bağlantıyı tekrarlı bir şekilde izleyerek kanonikleştirin , tüm bileşenler mevcut olmalıdır
$ mkdir testlink
$ cd testlink
pjb@pjb-desktop:~/testlink$ ln -s c b
pjb@pjb-desktop:~/testlink$ ln -s b a
pjb@pjb-desktop:~/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
pjb@pjb-desktop:~/testlink$ echo foo > c
pjb@pjb-desktop:~/testlink$ cat a
foo
pjb@pjb-desktop:~/testlink$ readlink -e a
/home/pjb/testlink/c
not: readlink a kendi kendine b döndürür
not # 2: find -l ile birlikte, zincirleri listelemek için bir yardımcı program kolayca perl olarak yazılabilir, ancak döngüleri algılamak için yeterince akıllı olması gerekir
Eğer bir döngü varsa readlink hiçbir şey çıkarmaz. Sanırım sıkışmaktan iyidir, sanırım.
pjb@pjb-desktop:~/testlink$ ln -sf a c
pjb@pjb-desktop:~/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
pjb@pjb-desktop:~/testlink$ readlink -e a
pjb@pjb-desktop:~/testlink$ # (note: no output)
brew install coreutils
vegreadlink -e <link>
İşte Bash'te özyinelemeli bir işlev:
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; }
Birden fazla satırda:
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
}
Örnekler:
$ chain d
d -> c -> b -> a
$ chain c
c -> b -> a
$ chain a
a
stat(1)
Bazı sistemlerde bulunmayacak olanı gerektirir .
Eğer isimler backticks, tek tırnak işareti veya "->" içeriyorsa başarısız olur. Sembolik bağlantı halkaları olan bir döngüde sıkışıp kalıyor (Bash 4'te bir ilişkisel dizi kullanılarak çözülebilir). Zaten kullanımda olup olmadığına bakılmaksızın "zincir" adlı bir değişken verir.
Bununla ilgili başka sorunlar olabilir.
Düzenle:
Bazı göreceli sembolik bağlantılarla ilgili bir sorun düzeltildi. Bazıları hala çalışmıyor, ancak aşağıdaki sürüm, bağlantının hedefinin var olmasını gerektirmiyor.
Readlink kullanan bir sürüm eklendi:
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
}
readlink
bunu gösterecek gibi görünmüyor. Ubuntu'da Java:/usr/bin/java -> /etc/alternatives/java -> /usr/lib/jvm/java-6-openjdk/jre/bin/java