आपको लगता है कि लक्ष्य एक प्रतीकात्मक लिंक है और एक फ़ाइल नहीं है, क्या लिंक का उपयोग करने rm
और unlink
हटाने के बीच कोई अंतर है ?
आपको लगता है कि लक्ष्य एक प्रतीकात्मक लिंक है और एक फ़ाइल नहीं है, क्या लिंक का उपयोग करने rm
और unlink
हटाने के बीच कोई अंतर है ?
जवाबों:
किसी भी समय आपके पास इस प्रकार के प्रश्न हैं, यह देखने के लिए कि वास्तव में क्या हो रहा है, थोड़ा परीक्षण की कल्पना करना सबसे अच्छा है। इसके लिए आप उपयोग कर सकते हैं strace
।
$ touch file1
$ strace -s 2000 -o unlink.log unlink file1
$ touch file1
$ strace -s 2000 -o rm.log rm file1
जब आप 2 परिणामी लॉग फ़ाइलों पर एक नज़र डालते हैं, तो आप "कॉल" देख सकते हैं कि प्रत्येक कॉल वास्तव में क्या कर रहा है।
इसके साथ unlink
यह unlink()
सिस्टम कॉल को लागू कर रहा है:
....
mmap(NULL, 106070960, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f6d025cc000
close(3) = 0
unlink("file1") = 0
close(1) = 0
close(2) = 0
exit_group(0) = ?
....
इसके साथ rm
थोड़ा अलग रास्ता है:
....
ioctl(0, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
newfstatat(AT_FDCWD, "file1", {st_mode=S_IFREG|0664, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
geteuid() = 1000
newfstatat(AT_FDCWD, "file1", {st_mode=S_IFREG|0664, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
faccessat(AT_FDCWD, "file1", W_OK) = 0
unlinkat(AT_FDCWD, "file1", 0) = 0
lseek(0, 0, SEEK_CUR) = -1 ESPIPE (Illegal seek)
close(0) = 0
close(1) = 0
close(2) = 0
exit_group(0) = ?
+++ exited with 0 +++
...
प्रणाली कॉल unlink()
और unlinkat()
अनिवार्य रूप से इस आदमी पृष्ठ में वर्णित मतभेदों को छोड़कर समान हैं: http://linux.die.net/man/2/unlinkat ।
अनलिंकैट () सिस्टम कॉल ठीक उसी तरह से संचालित होती है जैसे या तो (2) या rmdir (2) (इस पर निर्भर करता है कि झंडे में AT_REMOVEDIR ध्वज शामिल हैं या नहीं) इस मैनुअल पेज में वर्णित अंतरों को छोड़कर।
यदि pathname में दिया गया पथनाम सापेक्ष है, तो यह फाइल डिस्क्रिप्टर dirfd (कॉलिंग प्रक्रिया की वर्तमान कार्यशील निर्देशिका के सापेक्ष के बजाय, जैसा कि अनलिंक (2) और rmdir द्वारा किया जाता है, निर्देशिका के सापेक्ष व्याख्या की गई है) ) एक रिश्तेदार पथनाम के लिए)।
यदि pathname में दिया गया pathname सापेक्ष है और dirfd विशेष मान AT_FDCWD है, तो pathname को कॉलिंग प्रक्रिया की वर्तमान कार्यशील निर्देशिका (जैसे कि अनलिंक (2) और rmdir (2)) के सापेक्ष समझा जाता है।
यदि pathname में दिया गया pathname निरपेक्ष है, तो dirfd को अनदेखा किया जाता है।
AT_FDCWD
, इसलिए प्रभावी रूप से unlink
और के बीच कोई अंतर नहीं है unlinkat
।
पोसिक्स निर्दिष्ट करता है कि unlink
उपयोगिता सी लाइब्रेरी unlink
फ़ंक्शन को कॉल करती है और कुछ नहीं। इसका कोई विकल्प नहीं है। यदि आप किसी मान्य पथ का नाम पास करते हैं, जो निर्देशिका नहीं है, और यदि आपके पास उस निर्देशिका के लिए अनुमतियाँ हैं, जहाँ वह ऑब्जेक्ट रहता है, तो unlink
उसे निकाल देंगे।
rm
एक पारंपरिक यूनिक्स कमांड है जिसमें थोड़ी अन्य कार्यक्षमता है, और unlink
(नीचे देखें) का सुपरसेट नहीं है ।
सबसे पहले, rm
सुरक्षा जाँच करता है। यदि आप rm
किसी ऐसी वस्तु के लिए प्रयास करते हैं जिसके पास आपके पास लिखने की अनुमति नहीं है (जो इसे हटाने की आपकी क्षमता के लिए अप्रासंगिक है: सीधे अनुमति हैं!) rm
तब तक मना नहीं करता जब तक -f
कि निर्दिष्ट नहीं किया जाता है। rm
यदि फ़ाइल मौजूद नहीं है, तो सामान्य रूप से शिकायत होती है unlink
; हालांकि -f
, के साथ rm
शिकायत नहीं करता है। यह अक्सर मेकफाइल्स में शोषण किया जाता है ( clean: @rm -f $(OBJS) ...
) तो make clean
तब विफल नहीं होता है जब हटाने के लिए कुछ नहीं होता है।
दूसरे, के rm
पास -i
अंतःक्रियात्मक रूप से डिलीट की पुष्टि करने का विकल्प है।
तीसरा, rm
है -r
रिकर्सिवली एक निर्देशिका है, जो कुछ है जो है दूर करने के लिए unlink
, करने के लिए आवश्यक नहीं है के बाद से सी पुस्तकालय समारोह है कि नहीं करता है।
unlink
उपयोगिता वास्तव में एक छीन नीचे नहीं है rm
। यह क्या rm
करता है की एक सबसेट करता है, लेकिन इसमें शब्दार्थ है जो बिना किसी के rm
साथ -f
और rm का संयोजन है । -f
मान लीजिए कि आप अपनी नियमित अनुमतियों की परवाह किए बिना एक नियमित फ़ाइल को निकालना चाहते हैं। इसके अलावा, मान लें कि यदि फ़ाइल मौजूद नहीं है, या किसी अन्य कारण से आप कमांड को विफल करना चाहते हैं। न तो rm file
है और न ही rm -f file
आवश्यकताओं को पूरा करती। rm file
यदि फाइल लिखने योग्य नहीं है तो मना कर देगा। लेकिन rm -f file
अगर फ़ाइल गायब है, तो शिकायत करने की उपेक्षा करेंगे। unlink file
नौकरी करता है।
unlink
शायद इसलिए पेश किया गया था क्योंकि rm
बहुत चालाक है: कभी-कभी आप सिर्फ शुद्ध यूनिक्स unlink
शब्दार्थ चाहते हैं : "कृपया इस निर्देशिका में प्रवेश करें ताकि निर्देशिका की अनुमति हो" ।
unlink
बस का वर्णन के अंतर के बजाय।
एक ही फाइल के साथ, rm और अनलिंक एक ही कार्य करते हैं, फाइल को हटा दें। POSIX के रूप में परिभाषित किया गया है, rm
और unlink
दोनों को कॉल करने के लिए कॉल () सिस्टम कॉल।
जीएनयू में rm
, यह करने के लिए कॉल unlinkat () सिस्टम कॉल है, जो के बराबर है unlink()
या rmdir () इस मामले में जहां पथ एक रिश्तेदार पथ निर्दिष्ट करता है को छोड़कर कार्य करते हैं।
ध्यान दें
कुछ सिस्टम पर, unlink
डायरेक्टरी भी हटा सकते हैं। कम से कम ग्नू प्रणाली में, unlink
एक निर्देशिका का नाम कभी नहीं हटा सकता।