किसी विशेष पथ की ओर एक प्रतीकात्मक लिंक बिंदुओं के लक्ष्य को कैसे सत्यापित करें


16

बैश स्क्रिप्ट के भीतर, मुझे पता है कि मैं जांच सकता हूं कि क्या फ़ाइल निम्नलिखित सिंटैक्स के साथ एक प्रतीकात्मक लिंक है

if [ -L $path ]

क्या किसी को पता है कि अगर मैं उस पथ को किसी विशेष पथ से जोड़ता हूं तो मैं कैसे परीक्षण करूंगा? उदाहरण के लिए, मैं जांच करना चाहता हूं कि लक्ष्य क्या $pathहै /some/where



2
आप से जुड़ा हुआ मतलब है द्वारा एक विशेष मार्ग? क्या आप readlinkज्ञात पथ पर नहीं कर सकते हैं और इसकी तुलना उस पथ से कर सकते हैं जिसका आप परीक्षण कर रहे हैं?
ब्राचली

@Bratchley। हाँ, यही मेरा मतलब है .. उत्तर के लिए धन्यवाद।
बिलमैन 20

2
मैं दृढ़ता से आग्रह करता हूं कि आप हमेशा शेल वेरिएबल्स को उद्धरणों (जैसे if [ -L "$path" ]) में रखें , जब तक कि आपके पास कोई अच्छा कारण न हो और आपको यकीन है कि आप जानते हैं कि हम क्या कर रहे हैं।
जी-मैन का कहना है कि 'मोनिका'

@ महान प्रतिक्रिया के लिए जी-मैन धन्यवाद .. अवचेतन रूप से मैं ऐसा करना जानता हूं, लेकिन व्यवहार में इसे भूल जाओ .. सुदृढीकरण मदद करता है।
बिलमैन

जवाबों:


22

यदि आप जांचना चाहते हैं कि क्या $pathप्रतीकात्मक लिंक है जिसका लक्ष्य है /some/where, तो आप readlinkउपयोगिता का उपयोग कर सकते हैं । यह POSIX नहीं है, लेकिन यह कई प्रणालियों (GNU / Linux, BusyBox, * BSD,…) पर उपलब्ध है।

if [ "$(readlink -- "$path")" = /some/where ]; then 

ध्यान दें कि यह एक सटीक पाठ तुलना है। यदि लिंक का लक्ष्य है /some//where, या यदि यह है whereऔर मूल्य $pathहै /some/link, तो ग्रंथों का मिलान नहीं होगा।

कई readlinkविकल्प विकल्प का समर्थन करते हैं -f, जो सभी प्रतीकात्मक लिंक का विस्तार करके पथ को कैनोनिकलाइज़ करता है।

डैश, ksh, bash और zsh सहित कई गोले, बिलिन में -efऑपरेटर testका परीक्षण करने के लिए समर्थन करते हैं कि क्या दो फाइलें समान हैं (प्रतीकात्मक लिंक का अनुसरण करने के बाद एक ही फाइल के लिए हार्ड लिंक)। यह सुविधा भी व्यापक रूप से समर्थित है, लेकिन POSIX नहीं।

if [ "$path" -ef "/some/where" ]; then 

पहला उदाहरण तब काम नहीं करता है जब लिंक किसी सापेक्ष पथ को इंगित करता है ...
inmanja

1
@inemanja ज़रूर करता है। लेकिन जैसा कि मैंने कहा, यह एक पाठ तुलना है। यह एक ही लक्ष्य के लिए अलग-अलग रास्तों को अलग-अलग मानता है। यदि आप परीक्षण करना चाहते हैं कि क्या प्रतीकात्मक लिंक का लक्ष्य एक विशेष फ़ाइल है , बजाय एक विशेष पथ के , नीचे वर्णित विधियों में से एक का उपयोग करें।
गिलेस एसओ- बुराई को रोकना '

0

एक रिश्तेदार और निरपेक्ष पथ के साथ समस्याओं से बचने के लिए, और एक पथ या लिंक के अंत में "/":

if [ "$(realpath $(readlink -- "$path"))" = $(realpath /some/where) ]; then
    echo "Is"
else 
    echo "Is not"
fi

1
readlinkयह आवश्यक नहीं लगता है, realpathस्वचालित रूप से प्रतीकात्मक लिंक को हल करेगा।
दगांग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.