इस उदाहरण को देखते हुए:
mkdir a
ln -s a b
ln -s b c
ln -s c d
यदि मैं निष्पादित करता हूं:
ls -l d
यह दिखाएगा:
d -> c
इसके बजाय ls
दिखाने के लिए या किसी अन्य लिनक्स कमांड के लिए एक रास्ता है d -> c -> b -> a
?
इस उदाहरण को देखते हुए:
mkdir a
ln -s a b
ln -s b c
ln -s c d
यदि मैं निष्पादित करता हूं:
ls -l d
यह दिखाएगा:
d -> c
इसके बजाय ls
दिखाने के लिए या किसी अन्य लिनक्स कमांड के लिए एक रास्ता है d -> c -> b -> a
?
जवाबों:
बस उपयोग करें namei
:
$ namei d
f: d
l d -> c
l c -> b
l b -> a
d a
ls
। धन्यवाद!
readlink -e <link>
readlink [विकल्प] ... फ़ाइल
- -, -
दिए गए नाम के हर कंपोनेंट में हर सिम्कलिन का अनुसरण करके डिकोनाइज़िकल-मौजूदा कैनोनिकलाइज़ करें, सभी कंपोनेंट्स मौजूद होने चाहिए
$ 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
नोट: एक बार फिर से पढ़ने वाला b
नोट # 2: साथ में ढूँढें -l, चेन को सूचीबद्ध करने के लिए एक उपयोगिता आसानी से पर्ल में लिखी जा सकती है, लेकिन लूप का पता लगाने के लिए पर्याप्त स्मार्ट होना चाहिए
अगर आपके पास एक लूप है तो रीडिंक कुछ भी आउटपुट नहीं करेगा। यह अटक जाने से बेहतर है, मुझे लगता है।
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
औरgreadlink -e <link>
यहाँ बैश में एक पुनरावर्ती कार्य है:
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; }
कई लाइनों पर:
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
}
उदाहरण:
$ chain d
d -> c -> b -> a
$ chain c
c -> b -> a
$ chain a
a
इसकी आवश्यकता है stat(1)
जो कुछ प्रणालियों पर मौजूद नहीं हो सकता है।
यदि नाम बैकटिक्स, एकल उद्धरण, या "->" शामिल हैं तो यह विफल हो जाएगा। यह सिंपलिस लूप्स के साथ एक लूप में फंस जाता है (इसे बैश 4 में एक साहचर्य सरणी का उपयोग करके हल किया जा सकता है)। यह "चेन" नामक एक चर का निर्यात करता है, बिना इस बात के कि क्या यह पहले से उपयोग में है।
इसके साथ अन्य समस्याएं हो सकती हैं।
संपादित करें:
कुछ रिश्तेदार सहानुभूति के साथ एक समस्या को ठीक किया। कुछ अभी भी काम नहीं करते हैं, लेकिन नीचे दिए गए संस्करण में मौजूद लिंक के लक्ष्य की आवश्यकता नहीं है।
एक ऐसा संस्करण जोड़ा गया जो रीडलिंक का उपयोग करता है:
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
ऐसा प्रतीत नहीं होता। जावा उबंटू पर है:/usr/bin/java -> /etc/alternatives/java -> /usr/lib/jvm/java-6-openjdk/jre/bin/java