অনুমান করে আপনি জানেন যে লক্ষ্যটি একটি প্রতীকী লিঙ্ক এবং একটি ফাইল নয়, লিঙ্কটি ব্যবহার 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কখনই কোনও ডিরেক্টরির নাম মুছতে পারে না।