এমভি একটি ফাইল / ডিভ / নাল ব্রেক / ডেভ / নাল


25

যদি আমি করি: touch file; mv file /dev/nullমূল হিসাবে, /dev/nullঅদৃশ্য হয়ে যায়। ls -lad /dev/nullএরকম কোনও ফাইল বা ডিরেক্টরিতে ফলাফল নেই। এটি এমন অ্যাপ্লিকেশনগুলিকে ভেঙে দেয় যা এসএসএইচের /dev/nullমতো নির্ভর করে এবং এর মাধ্যমে সমাধান করা যায় mknod /dev/null c 1 3; chmod 666 /dev/null। নিয়মিত ফাইলটিকে এই বিশেষ ফাইলটিতে স্থানান্তরিত করার কারণে কীভাবে গায়েব হতে চলেছে /dev/null?

স্পষ্ট করার জন্য, এটি পরীক্ষার উদ্দেশ্যে ছিল, এবং আমি বুঝতে পারি যে mvকমান্ডটি কীভাবে কাজ করে। আমি কৌতূহল বোধ করি কেন ls -la /dev/nullএটি নিয়মিত ফাইলের সাথে প্রতিস্থাপনের আগে প্রত্যাশিত আউটপুট প্রদর্শন করে তবে পরে এটি দেখায় যে /dev/nullঅস্তিত্ব নেই যদিও একটি ফাইল মূল mvকমান্ডের মাধ্যমে তৈরি হয়েছিল এবং ফাইল কমান্ডটি ASCII পাঠ্য দেখায়। আমি মনে করি এটি অবশ্যই কোনও lsকমান্ড আচরণের মিশ্রণ হিসাবে devfsযখন কোনও অ-বিশেষ ফাইল একটি অক্ষর / বিশেষ ফাইল প্রতিস্থাপন করে with এটি ম্যাক ওএস এক্সে রয়েছে, অন্যান্য ওএসের আচরণের ক্ষেত্রেও তারতম্য থাকতে পারে।


44
সাথে বিশৃঙ্খলা করবেন না /dev/null
ডেভনুল

7
তাই @ দেবনুল বলেছেন
ব্রাইয়াম

3
ফাইলগুলি মুছে ফেলার সঠিক উপায় হ'ল rmকমান্ড।
কেসী

1
দেখে মনে হচ্ছে এটি আপনার সমস্যার মূল কারণ, ওএসএক্স devfsসাধারণ ফাইলগুলি সম্পর্কে মজার। আজব আপনি mvযদিও ত্রুটি পান নি। এই উপায় সম্পর্কে touch testfile; mv testfile /dev:?
গ্রীম

3
@ গ্রেগ, mvকেবল একই ফাইল সিস্টেমে পারমাণবিক হতে পারে।
গ্রিম

উত্তর:


16

এমভি জন্য সোর্স কোড এ খুঁজছি http://www.opensource.apple.com/source/file_cmds/file_cmds-220.7/mv/mv.c :

/*
 * If rename fails because we're trying to cross devices, and
 * it's a regular file, do the copy internally; otherwise, use
 * cp and rm.
 */
if (lstat(from, &sb)) {
    warn("%s", from);
    return (1);
}
return (S_ISREG(sb.st_mode) ?
    fastcopy(from, to, &sb) : copy(from, to));

...

int
fastcopy(char *from, char *to, struct stat *sbp)
{
...
while ((to_fd =
    open(to, O_CREAT | O_EXCL | O_TRUNC | O_WRONLY, 0)) < 0) {
        if (errno == EEXIST && unlink(to) == 0)
            continue;
        warn("%s", to);
        (void)close(from_fd);
        return (1);
}

কিছুক্ষণের লুপটি প্রথম পাসের সময় open(to, O_CREAT | O_EXCL | O_TRUNC | O_WRONLY, 0)EEXIST দিয়ে ব্যর্থ হবে। তারপরে /dev/nullলিঙ্কযুক্ত হবে এবং লুপটি পুনরাবৃত্তি হবে। তবে আপনি যেমন আপনার মন্তব্যে উল্লেখ করেছেন, নিয়মিত ফাইলগুলি তৈরি করা যায় না /dev, সুতরাং লুপটি পরবর্তী পাসে open(to, O_CREAT | O_EXCL | O_TRUNC | O_WRONLY, 0)এখনও ব্যর্থ হতে চলেছে।

আমি অ্যাপলের সাথে একটি বাগ রিপোর্ট ফাইল করব। mvসোর্স কোড বেশিরভাগই FreeBSD 'র সংস্করণ থেকে অপরিবর্তিত, কিন্তু ওএসএক্স এর devfs নিয়মিত ফাইলগুলির সাথে অ-POSIX আচরণ আছে, অ্যাপল তাদের ঠিক করা উচিত mv


1
উত্স কোড সরবরাহ করার জন্য এবং এটিকে বাগ হিসাবে স্বীকৃতি দেওয়ার জন্য আমি এখনই এই সেরা উত্তরটি দিচ্ছি, যা আমি চালাচ্ছিলাম।
গ্রেগ লেভেন্টাল

12

ইতিমধ্যে বিদ্যমান ফাইলের স্থানে একটি ফাইল স্থানান্তর করা বিদ্যমান ফাইলটিকে প্রতিস্থাপন করে। এক্ষেত্রে /dev/nullডিভাইস ফাইলটি অন্য সাধারণ ফাইলের মতো প্রতিস্থাপন করা হবে। এটি এড়াতে -i(ইন্টারেক্টিভ, ওভাররাইট করার আগে সতর্ক করে) বা এর জন্য -n(কোনও ক্লোবার নেই) বিকল্পটি ব্যবহার করুন mv

/dev/nullশুধুমাত্র বিট-বালতি হিসাবে তার বিশেষ কার্য সম্পাদন করে তারপরে ডিভাইসটি যেমন খোলা থাকে। উদাহরণস্বরূপ, যখন >শেল অপারেটর ব্যবহার করা হয়, তখন ফাইলটি খোলার পরে ছেঁটে ফেলা হয় (একটি প্রতিস্থাপন সরানো হয়নি, যা আপনি প্রত্যাশা করেছিলেন। কেসির দ্বারা উল্লিখিত হিসাবে, কোনও ফাইল অপসারণের সঠিক উপায়টি এর সাথে rmবা এমনকি সহ unlink


আমার মন্তব্যগুলি টেরডনে দেখুন।
গ্রেগ লেভেন্টাল

বোঝা গেল, -d অনিবদ্ধ ছিল, এটি কেবলমাত্র একটি খারাপ অভ্যাস তবে ফাইলটি এখনও এলএস আউটপুটে প্রদর্শিত হবে, এটি অস্তিত্বহীন হিসাবে দেখা উচিত নয়।
গ্রেগ লেভেনথাল

@ গ্রামীম - 3 কে আপনাকে স্বাগতম, চমৎকার কাজ!
slm

10

উম্ম, কারণ আপনি সাধারণ একটি দিয়ে বিশেষ ফাইলটি ওভাররাইট করেন? আপনি কি ঘটবে বলে আশা করেছিলেন? dev/nullএটি কোনও ডিরেক্টরি নয়, এটি একটি nullডিভাইসকে নির্দেশ করে এমন একটি ফাইল । আপনি যখন mvএটিতে কিছু করেন, আপনি মূলটি মুছুন এবং আপনি যা সরিয়ে নিয়েছেন তা দিয়ে এটি প্রতিস্থাপন করুন:

$ file /dev/null 
/dev/null: character special 
$ sudo mv file /dev/null 
$ file /dev/null 
/dev/null: ASCII text

2
তবে আমি বলছি / ls -lad / dev / null চালানোর সময় / dev / নাল অনুপস্থিত হিসাবে প্রদর্শিত হয়েছিল। এটি অবশ্যই ডেফদের জন্য নির্দিষ্ট কিছু হতে হবে, যা আমি এটি জানতে চেয়েছিলাম।
গ্রেগ লেভেন্টাল

আমি যদি এমভি ফাইল / দেব / নাল করি তবে / ডিভ / নালটিতে কোন ফাইল থাকা উচিত কিন্তু এখনও বিদ্যমান আছে। আমি জানতে চাইছি কেন এই কারণে / dev / নালকে একটি ls তে খুঁজে পাওয়া যায়নি।
গ্রেগ লেভেন্টাল

মঞ্জুর, আমি এটি একটি ম্যাকের উপর করছি, সুতরাং এটি কিছুটা আলাদা হতে পারে তবে আমি ফাইলটি অনুপস্থিত হিসাবে দেখানোর আশা করিনি, আমি কেবল এটি উত্স ফাইলে পরিবর্তিত হিসাবে প্রদর্শিত হবে বলে আশা করি।
গ্রেগ লেভেনথাল

@ গ্রেগলিভেন্থাল হ্যাঁ, এটি অবশ্যই একটি ওএসএক্স বা বিএসডি জিনিস হতে হবে (দয়া করে আপনার প্রশ্নটি সম্পাদনা করুন এবং আপনার ওএস নির্দিষ্ট করুন)। আমার লিনাক্সে আমি এখনও দেখতে পাচ্ছি /dev/null, এটি সরানো ফাইল হয়ে গেছে।
টেরডন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.