2012-01-31 13 views
7
if (-e "$ENV{MYHOME}/link") { 
    system("rm $ENV{MYHOME}/link"); 
} 

यह कोड यह जांचने के लिए किया जा रहा है कि एक सिम्लिंक मौजूद है या नहीं और इसे हटा दें।पर्ल का उपयोग करते हुए, यदि यह मौजूद है तो सिमलिंक को कैसे जांचें और हटाएं?

मैं एक बग ट्रैक कर रहा हूं जहां यह कोड काम नहीं करता है। मैं अब तक इसे समझने में सक्षम नहीं हूं, लेकिन क्या हो रहा है यह है कि यह कोड सिम्लिंक को हटाने में असमर्थ है, जिसके परिणामस्वरूप लाइन के नीचे 'फ़ाइल मौजूद है' त्रुटि होती है।

मैं यह जांचना चाहता था कि इस तकनीक के साथ कुछ मौलिक दोष है या नहीं? मैंने के बारे में भी पढ़ा है लेकिन कुछ कारणों से वर्तमान दृष्टिकोण की सिफारिश नहीं की जानी चाहिए?

उत्तर

19

बस का उपयोग करें कहो क्यों। -l पूछता है कि लक्ष्य एक लिंक है या नहीं। -e पूछता है कि फ़ाइल मौजूद है या नहीं। यदि आपका लिंक एक अस्तित्वहीन फ़ाइल के लिए है, तो यह झूठा वापस आ जाएगा, और आपका कोड लिंक को हटाने में विफल रहेगा।

+0

'-l' जांचता है कि फ़ाइल सिमलिंक या हार्ड लिंक है या नहीं? अथवा दोनों? – mask8

+0

@ mask8 - '-l' यह सही होता है यदि पथ एक सिम्लिंक है। हार्ड लिंक्ड फाइलें नियमित फाइलों के रूप में दिखाई देती हैं, जहां एकमात्र अंतर उनकी लिंक गिनती है (स्टेटस से 'st_nlink') एक से अधिक है। लिनक्स/यूनिक्स में निर्देशिकाओं को मुश्किल से जोड़ा नहीं जा सकता है। – unpythonic

0

आपके कोड में केवल उस उपयोगकर्ता की अनुमति होगी जिसके तहत यह चल रहा है। क्या यह संभव है कि सिम्लिंक किसी अन्य उपयोगकर्ता के स्वामित्व में है और लिखने योग्य नहीं है? अनलिंक विफल रहता है

if (-l "$ENV{MYHOME}/link") { 
    unlink "$ENV{MYHOME}/link" 
     or die "Failed to remove file $ENV{MYHOME}/link: $!\n"; 
} 

हैं, तो यह करना होगा:

इसके अलावा, वहाँ हमेशा संभावना है कि $ ENV {MyHome} शामिल नहीं है आप क्या सोचते हैं यह होता है ...

+0

हां, यह एक संभावना है जिसे मैं देख रहा हूं, यह संभव है लेकिन ऐसा नहीं होना चाहिए। – Lazer

+0

बीटीडब्ल्यू, अनलिंक अधिक कुशल है क्योंकि आप किसी अन्य प्रक्रिया को नहीं रोक रहे हैं। साथ ही, मुझे नहीं पता कि आपके सिस्टम को कितनी भारी लोड किया गया है या यह कितनी बार होता है, लेकिन इस तरह की एक प्रणाली कॉल को तोड़ने से आपकी पिड टेबल पूरी तरह से फंसे होने की संभावना खुलती है और फोर्क करने में सक्षम नहीं होता है। –

0

प्रासंगिक ऑपरेटिंग सिस्टम का अपना errno.h है। मैं प्रत्येक त्रुटियों को संभालने के लिए Errno.pm का उपयोग करूंगा।

use Errno; 
use File::Spec; 

my $dir = File::Spec->catfile($ENV{MYHOME}, 'link'); 

if (!unlink $dir) { 
    if ($! == Errno::ENOENT) { 
     die "Failed to remove '$dir'. File doesn't exist:$!"; 
    } 
} 
+0

पीछे? "वास्तविक" त्रुटियों को अनदेखा क्यों करें और केवल उस व्यक्ति को मुद्रित करें जो इससे कोई फर्क नहीं पड़ता। – ikegami

+2

पीएस - 'Errno का उपयोग करें; अगर ($! == Errno :: ENOENT) 'लिखा जा सकता है' अगर ($! {ENOENT}) '। – ikegami

+0

आपके उत्तर के लिए धन्यवाद, ikegami। वास्तविक त्रुटियां लोकेल संवेदनशील हैं और हैंडलिंग के लिए नहीं हैं। वैसे भी, मुझे '%! 'मुहावरे नहीं पता था। +1 – ernix

संबंधित मुद्दे