'আরএম। *' কি পিতামাতার ডিরেক্টরিটি মুছে দেয়?


53

.*বর্তমান এবং মূল নির্দেশিকা অন্তর্ভুক্ত করতে বাশ দ্বারা অভিব্যক্তিটি প্রসারিত করা হয়েছে:

$ ls -la
total 2600
drwxrwxrwx   2 terdon terdon 2162688 Sep 10 16:22 .
drwxr-xr-x 142 terdon terdon  491520 Sep 10 15:34 ..
-rw-r--r--   1 terdon terdon       0 Sep 10 16:22 foo
$ echo .*
. ..

যদি আমি চালানোর rm -rf .*আমার ডেবিয়ান ব্যবহার গনুহ ব্যাশ উপর, version 4.2.36(1)-releaseএবং rmথেকে rm (GNU coreutils) 8.13, আমি এই বার্তাটিকে পাবেন:

$ rm -rf .*
rm: cannot remove directory: `.'
rm: cannot remove directory: `..'

এটি কি জিএনইউ জিনিস বা এটি পসিক্স? এমন কোনও * নিক্স সিস্টেম রয়েছে যেখানে উপরের কমান্ডটি নিঃশব্দে মুছে ফেলবে .এবং ..?

এছাড়াও, এটি শেলের কোনও সুরক্ষা বৈশিষ্ট্য বা rmকমান্ড নিজেই?


4
আমি জানি এই প্রশ্নের প্রসঙ্গে হয় rm, কিন্তু আমি ভেবেছিলাম এটা উল্লেখ আপনি এখনও সঙ্গে অপ্রত্যাশিত ফলাফল থাকতে পারে যে মূল্য ছিল chmod, chownইত্যাদি যখন মিলে .*
অ্যারন কোপলি

উত্তর:


59

সর্বশেষ (2017 হিসাবে) জন্য POSIX বৈশিষ্ট সংস্করণ rmইউটিলিটি এখানে (এবং আগের সেখানে ) এবং মুছে ফেলার নিষিদ্ধ .এবং ..

যদি ডট বা ডট-ডট ফাইলগুলির মধ্যে কোনও অপারেন্ডের মূল নাম অংশ হিসাবে চিহ্নিত করা হয় (এটি চূড়ান্ত পথের নাম উপাদান) বা যদি কোনও অপারেন্ড মূল ডিরেক্টরিতে সমাধান করে তবে rm স্ট্যান্ডার্ড ত্রুটিতে ডায়াগনস্টিক বার্তা লিখবে এবং কিছুই করবে না যেমন অপারেশন সঙ্গে আরও।

@ জেলিয়াগ্রে দ্বারা উল্লিখিত হিসাবে, অংশটি SUSv4 /এ একটি সংযোজন।

প্রাচীনতম সর্বজনীনভাবে উপলভ্য ইউনিক্সের অনুমান যা আমি খুঁজে পেয়েছি ( XPF4 CAE rev2 (1994)), ইতিমধ্যে এটি নির্দিষ্ট করেছে .এবং ..সরানো যাবে না, যদিও জিএনইউ ফাইলল্টিজ চেঞ্জলগে মন্তব্য করা হয়েছে যে এটি পুরাতন পসিক্স স্পেক্সগুলিতে ইতিমধ্যে ছিল।

মনে রাখবেন এটি প্রযোজ্য dir/..এবং ../পাশাপাশি, তবে কিছু বাস্তবায়ন (ইউএনআইএক্স-প্রত্যয়িত সোলারিস 11 এবং ম্যাকোস সহ) এখনও rm -rf ../বা এর বিরুদ্ধে সুরক্ষা দেয় না rm -rf .*/)।

ইতিহাস

প্রারম্ভিক unices

ইউনিক্স ভি 3 (1973) এ -rবিকল্পটি rmযুক্ত করা হয়েছে যদিও এটি কেবল ডিরেক্টরিগুলির সামগ্রী মুছে ফেলছিল, তবুও আপনাকে rmdirডিরেক্টরিগুলি সরানোর জন্য ব্যবহার করতে হবে।

এটি ইউনিক্স ভি 7-তে পরিবর্তিত হয়েছিল (1979 সালে, রিলিজটি বোর্ন শেলকেও প্রবর্তন করেছিল এবং যেখান থেকে বেশিরভাগ ইউনিসি উদ্ভূত হয়েছিল)। rm -rএখন ডিরেক্টরিগুলি সরানো হয়েছে এবং ..ডিরেক্টরি ট্রি মুছবে না । Man পৃষ্ঠা পদ বলে:

..অজান্তেই এমন কিছু করার অসামাজিক পরিণতি এড়াতে কেবল ফাইলটি সরিয়ে নেওয়া নিষিদ্ধ rm -r .*

(যদিও কেউ যুক্তিযুক্ত হতে পারে যে rm -r .*এটি এখনও অসামাজিক. ) কারণ এটি অন্তর্ভুক্ত রয়েছে বলে সমস্ত কিছু মুছে ফেলা হয়।

এটি এখনও মুছে ফেলতে স্বীকার করে নি .যদিও এটি লিঙ্কগুলি .বা ..এন্ট্রিগুলিকে লিঙ্কযুক্ত করে না । সুতরাং, rm -r .বর্তমান ডিরেক্টরি খালি করার একটি কার্যকর উপায় ছিল।

আরও মনে রাখবেন যে সেফগার্ডটি কেবল আক্ষরিক ..যুক্তির জন্য ছিল , না dir/..বা এর জন্য নয় ./..। সুতরাং, rm -rf ./.*তবুও অভিভাবক ডিরেক্টরিতে পুনরাবৃত্তভাবে সমস্ত কিছু মুছে ফেলা হবে।

এটি দেখতে আকর্ষণীয় যে এটি ইতিমধ্যে যে সমস্যাগুলি / ভুল ত্রুটিগুলি দ্বারা গ্লোবগুলি অন্তর্ভুক্ত করতে পারে .এবং ..তাদের সম্প্রসারণে কাজ করেছিল তা কার্যকর হয়েছিল। যে Forsyth, শেল প্রয়াত 80s মধ্যে (মূল Minix শেল এবং pdksh ভিত্তি), সংশোধন করা হয় zsh(1990) এবং fish(2005) কিন্তু অন্যান্য শাঁস এবং বিশেষ না POSIX মধ্যে shভাষা সম্প্রসারণ প্রয়োজন .*অন্তর্ভুক্ত করা .এবং ..যদি সেগুলি দিয়ে ফিরে আসে readdir()( bashসমস্যাগুলি কেবল আংশিকভাবে সম্বোধন করে shopt -s dotglobযেখানে গ্লোবগুলি ( .xxxসেগুলি ব্যতীত ) অন্তর্ভুক্ত হয় না .বা ..এবং এর মাধ্যমে kshআপনি এটি সমাধান করতে পারেন FIGNORE='@(.|..)')।

হুবহু নিষেধাজ্ঞার .পাশাপাশি যুক্ত করা সর্বদা পরিষ্কার হয় না এবং প্রতিটি ইউনিক্সের সাথে পরিবর্তিত হয়। নীচে কয়েকটি অনুসন্ধান।

BSD গুলোর

এর বাধা দিত .2.9BSD (1983) এবং 2.10BSD (1987) মধ্যে এবং 4.2BSD (1983) এবং 4.3BSD (1986) মধ্যে একদা যোগ করা হয়েছিল (দেখুন এই পরিবর্তন UNIX-ইতিহাস-রেপো তে 1985 timestamped )।

$ wget -qO- http://www.tuhs.org/Archive/PDP-11/Distributions/ucb/2.9BSD/root.tar.gz |
    zgrep -ao 'rm: canno[[:print:]]*'
rm: cannot remove `..'
$ wget -qO- http://www.tuhs.org/Archive/PDP-11/Distributions/ucb/2.10bsd.tar.gz |
    zgrep -ao 'rm: canno[[:print:]]*'
rm: cannot remove `.' or `..'
rm: cannot remove `.' or `..'\n");

জন্য dir/.এবং dir/..দেখুন 1988 সালে এই পরিবর্তন (বাসদ 4.3 নিট / 1)।

এই আজ পর্যন্ত, rmএর FreeBSD 'র (এবং MacOS মত ডেরাইভেটিভস) এখনও উপর বর্তমান বা পেরেন্ট ডাইরেক্টরি empties rm -rf ./বা rm -rf ../যদিও (ব্যাপারে rm -rf .*/)।

সিস্টেম ভি

ভি 7 এর পরে এটিএন্ডটি ইউনিক্স ডেরিভেটিভসের জন্য উত্স বা বাইনারি উভয়ই প্রকাশ্যে উপলভ্য হওয়ায় আমার কাছে তেমন তথ্য নেই। তার অনলাইন ম্যানুয়ালটিতে, এইচপিইউক্স (সিস্টেম III এর ভিত্তিতে) এখনও উল্লেখ করেছে যে এটি কেবলমাত্র ..কার্যকরভাবে নিষিদ্ধ করেছে যখন এটি উভয়কেই কার্যকরভাবে নিষেধ করে যা সম্ভবত এটি অন্তত SysIII মুছে ফেলার নিষেধ করেনি .( সম্পাদনা : এখন সিসিআইআইআই rmউত্স কোডটি দেখছেন , এটি ইউনিক্স ভি 7 এর পরে কার্যত অপরিবর্তিত)।

অন্য সমস্ত অনলাইন ম্যানুয়াল আমি মুছে ফেলার উল্লেখ পরীক্ষা করেছি .বা ..নিষিদ্ধ যা POSIX অনুসারী হওয়ার আশা করা হয়।

সোলারিস rmএখনও উপর বর্তমান বা পেরেন্ট ডাইরেক্টরি empties rm -rf ./বা rm -rf ../

গনুহ

গনুহ fileutils জন্য প্রথম পরিবর্তণের সকল ঐতিহাসিক তথ্য রয়েছে।

যদিও মূলত মুছে ফেলা .বা ..নিষেধ করা হয়নি, ..প্রথমে এবং তারপর উভয় (সহ dir/.), সমস্তই 1990 এবং 1991 এর মধ্যে নিষিদ্ধ ছিল ।

অন্যান্য

যেমনটি আমরা দেখেছি, zshএর .*(বা কোনও গ্লোব) বিস্তৃতি কখনই অন্তর্ভুক্ত করে না .বা ..(এমনকি shএমুলেশন মোডেও)। rmBuiltin (যা আপনি যদি পেতে zmodload zsh/files) অতএব আচরণ করে না .বা ..বিশেষভাবে। সুতরাং, যে সঙ্গে zshbuiltin, আপনি পারেন rm -rf .বা rm -rf ..খালি .বা .., কিন্তু rm -rf .*সরানো হবে না .বা ..

, Busybox সালে rm, এর মোছা চালিয়ে যাওয়া বাধা দিত .এবং ..(2001) 0.52 মধ্যে যোগ করা হয়েছিল


অদ্ভুত, এটি নির্দিষ্ট করে বলে মনে হচ্ছে rm -rf . /(স্থানটি নোট করুন) দুটি সতর্কতা ( .এবং এর জন্য) প্রিন্ট করে /প্রস্থান করা উচিত, তবে আমরা প্রতি কয়েকমাস পর থেকে কীভাবে পুনরুদ্ধার করব জানতে চাইলে আমরা একটি প্রশ্ন পেয়েছি।
কেভিন

6
@ কেভিন সমস্ত সিস্টেমই পসিক্সের অনুগত নয় এবং সর্বশেষ পসিক্স রিলিজটিতে মূল ডিরেক্টরি নিষেধাজ্ঞাকে কেবল স্পষ্টভাবে যুক্ত করা হয়েছিল।
jlliagre

@ jlliagre আমি দেখছি জিএনইউ সাধারণত পসিক্স (+ এক্সটেনশানগুলি অবশ্যই) প্রয়োগ করার চেষ্টা করে এবং আমি কল্পনা করেছিলাম তারা এটিকে যুক্ত করতে চাইবে, তবে যদি এটি মোটামুটি নতুন হয় তবে এটি ব্যাখ্যা করবে।
কেভিন

2
@ স্টাফেন: আপনি ঠিকই বলেছেন, তবে আমি আপনার উত্তরের শুরুতে একটি বড় "হ্যাঁ, এটি ঘটতে পারে! তবে ..." যুক্ত করব, যাতে লোকেরা নিঃসন্দেহে জানতে পারে যে কয়েকটি (বয়স্ক বা কেবল অ -পসিক্স অনুগত) সিস্টেমগুলি, তারা পিতামাতার ডিরেক্টরি মুছতে পারে। আমি সেই সম্ভাবনাটি সর্বদা চিহ্নিত করার চেষ্টা করি (অর্থাত্ আমি নিরাপদে পাশে থাকার চেষ্টা করি, যদিও এর উত্তরটি মাঝে মাঝে পড়তে / মনে রাখা শক্ত করে তোলে) ^^
অলিভিয়ার ডুলাক

1
@ মার্টিনশ্রেডার, বিএসডিগুলিতে এটি 2.8BSD এবং 2.10BSD (কেবলমাত্র ".." এর আগে ইউনিক্সভি 7 এর মতো নিষিদ্ধ ছিল) এবং 3BSD এবং 4.3RENO এর মধ্যে যুক্ত করা হয়েছিল। SysV সিস্টেমে, এটি কম পরিষ্কার। উদাহরণস্বরূপ এইচপিউএক্স ম্যানুয়াল দাবি করে যে এটি কেবল ".." নিষেধ করে তবে কার্যত এটি উভয়কেই নিষিদ্ধ করে। " এবং "..", এটি কেবলমাত্র ম্যানুয়ালই আপ টু ডেট নয়।
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.