অনুমান করে আপনি জানেন যে লক্ষ্যটি একটি প্রতীকী লিঙ্ক এবং একটি ফাইল নয়, লিঙ্কটি ব্যবহার 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
এটা invoking এর 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) বা আরএমডিির (2) (পতাকাগুলিতে AT_REMOVEDIR পতাকা অন্তর্ভুক্ত কিনা তা নির্ভর করে) ঠিক একইভাবে কাজ করে।
পাথনামে প্রদত্ত পাথের নামটি যদি আপেক্ষিক হয় তবে ফাইল বর্ণনাকারী ডায়ারফডি দ্বারা উল্লিখিত ডিরেক্টরিটির সাথে এটি ব্যাখ্যা করা হয় (কলিং প্রসেসের বর্তমান কার্যকারী ডিরেক্টরিের তুলনায়, লিঙ্কবিহীন (2) এবং rmdir (2) দ্বারা করা হিসাবে ) আপেক্ষিক পথের নামের জন্য)।
যদি পাথনামে প্রদত্ত পাথের নামটি আপেক্ষিক এবং dirfd হ'ল বিশেষ মান AT_FDCWD হয়, তবে পথের নাম কলিং প্রক্রিয়াটির বর্তমান চলমান ডিরেক্টরি (যেমন আনলিংক (2) এবং rmdir (2) এর সাথে সম্পর্কিত is
পথের নাম দেওয়া পথটি যদি নিখুঁত হয় তবে dirfd এড়ানো হবে।
AT_FDCWD
, কার্যকরভাবে unlink
এবং এর মধ্যে কোনও পার্থক্য নেই unlinkat
।
পসিক্স উল্লেখ করে যে unlink
ইউটিলিটি সি লাইব্রেরি unlink
ফাংশন এবং অন্য কিছুই নয়। এটি কোনও বিকল্প নেয় না। যদি আপনি কোনও বৈধ পথের নামটি কোনও ডিরেক্টরিতে পাস করেন যা ডিরেক্টরি নয়, এবং যদি আপনার সেই ডিরেক্টরিতে লেখার অনুমতি থাকে যেখানে সেই বস্তুটি থাকে, তবে unlink
এটি সরিয়ে ফেলবে।
rm
একটি traditionalতিহ্যবাহী ইউনিক্স কমান্ড যাতে অন্যান্য কার্যকারিতা রয়েছে এবং এটি unlink
নীচে দেখুন supers
প্রথমত, 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
এবং unlink
উভয়ই কল আনলিংক করতে () সিস্টেম কল করে।
গনুহ ইন rm
, এটা কল unlinkat () সিস্টেম কল, যা সমতূল্য unlink()
বা কাছে rmdir () ক্ষেত্রে যেখানে পথ একটি আপেক্ষিক পাথ নির্দিষ্ট করে ছাড়া ফাংশন।
বিঃদ্রঃ
কিছু সিস্টেমে unlink
ডিরেক্টরি মুছে ফেলতেও পারে। কমপক্ষে জিএনইউ সিস্টেমে unlink
কখনই কোনও ডিরেক্টরির নাম মুছতে পারে না।