Oc noclobber` সেট করার কোনও অসুবিধা আছে?


20

প্রদত্ত যে zshকমান্ড দেওয়া সব ফাইল পরাস্ত করতে পারেন:

>*

আমি ভাবছি যে বিকল্পটি সেট noclobberকরা একটি ভাল ধারণা হবে।

আমি >| fileবাশ এবং zsh উভয় ক্ষেত্রে ডিফল্ট ক্লোবার ব্যবহার করতে চাইলে আমি সর্বদা ব্যবহার করতে পারি। (zsh এছাড়াও বিকল্প সিনট্যাক্সের অনুমতি দেয় >!file)।

আমি অনুমান করছি noclobberযে পসিক্সের সামঞ্জস্যের কারণে ডিফল্টরূপে আনসেট করা আছে তবে নিশ্চিত হওয়ার জন্য:

সেটিংয়ে noclobberকি কোন ডাউনসাইড আছে ?

noclobberকেবলমাত্র ইন্টারেক্টিভ শেলটির জন্য কী সেট আছে ?


3
আমি অবাক হয়েছি zsh কমপক্ষে সে সম্পর্কে সতর্ক করে না, প্রদত্ত যে এটির মতো কিছু সম্পর্কে সতর্ক করে দেয় rm *...
ইলক্কাচু

উত্তর:


24

কারণটি noclobberডিফল্ট হিসাবে সেট করা হয়নি traditionতিহ্য। ব্যবহারকারীর ইন্টারফেস ডিজাইনের বিষয় হিসাবে, "এই নতুন ফাইলটি তৈরি করা" সহজ ক্রিয়া করা এবং অতিরিক্ত বাধাটিকে আরও বিপজ্জনক ক্রিয়া করা "একটি নতুন ফাইল তৈরি করুন বা বিদ্যমান ফাইলটি ওভাররাইট করুন" তৈরি করা ভাল ধারণা। সুতরাং noclobberএটি একটি ভাল ধারণা ( >একটি নতুন ফাইল তৈরি >|করতে, সম্ভাব্যভাবে বিদ্যমান ফাইলটি ওভাররাইট করতে) এবং শেলটি কয়েক দশক পরে ডিজাইন করা থাকলে এটি সম্ভবত ডিফল্ট হত।

আপনার ইন্টারেক্টিভ শেল স্টার্টআপ ফাইলে ( .bashrcবা .zshrc) নিম্নলিখিতগুলি ব্যবহার করার জন্য আমি দৃ strongly়ভাবে পরামর্শ দিচ্ছি :

set -o noclobber
alias cp='cp -i'
alias mv='mv -i'

প্রতিটি ক্ষেত্রে (পুনর্নির্দেশ, অনুলিপি করা, চলন্ত) লক্ষ্যটি হ'ল অপারেশনটিতে বিদ্যমান কিছু তথ্য মুছে ফেলার পার্শ্ব প্রতিক্রিয়া থাকতে পারে, যদিও বিদ্যমান তথ্য মুছে ফেলা অপারেশনের প্রাথমিক লক্ষ্য নয়। আমি rm -iএই তালিকায় রাখি না কারণ তথ্য মুছে ফেলাটাই প্রাথমিক লক্ষ্য rm

দয়া করে মনে রাখবেন না noclobberএবং -iহয় নিরাপত্তা জাল । যদি তারা ট্রিগার করে, আপনি কিছু ভুল করেছেন । সুতরাং আপনি কী ওভাররাইট করছেন তা যাচাই না করার জন্য অজুহাত হিসাবে তাদের ব্যবহার করবেন না! মুল বক্তব্যটি হ'ল আপনার চেক করা উচিত ছিল যে আউটপুট ফাইলটি বিদ্যমান নেই। যদি আপনাকে বলা হয় file exists: fooবা overwrite 'foo'?, এর অর্থ হল আপনি একটি ভুল করেছেন এবং আপনার খারাপ লাগা উচিত এবং আরও সতর্ক হওয়া উচিত। বিশেষত, yওভাররাইট করার অনুরোধ জানানো হলে বলার অভ্যাসে যাবেন না (যুক্তিযুক্তভাবে, এলিয়াসগুলি হওয়া উচিত alias cp='yes n | cp -i' mv='yes n | mv -i', তবে Ctrl+ টিপুন Cআউটপুট আরও ভাল দেখায়): যদি আপনি ওভাররাইট, কমান্ড বাতিল, আউটপুট সরানো বা সরিয়ে ফেলতে চাইছেন ফাইল করুন এবং আবার কমান্ড চালান।

এই সুরক্ষাগুলি ট্রিগার করার অভ্যাসে না alsoুকে পড়াও গুরুত্বপূর্ণ কারণ আপনি যদি এমনটি করেন তবে একদিন আপনি এমন একটি মেশিনে থাকবেন যা আপনার কনফিগারেশনটি রাখে না এবং আপনি ডেটা হারাবেন কারণ আপনি যে সুরক্ষাগুলি রক্ষণভাগে গণনা করছেন তা ' সেখানে।

noclobberকেবলমাত্র ইন্টারেক্টিভ শেলগুলির জন্য সেট করা হবে, যেহেতু .bashrcবা .zshrcকেবল ইন্টারেক্টিভ শেলগুলিই পড়ে। অবশ্যই আপনার শেল বিকল্পগুলি এমনভাবে পরিবর্তন করা উচিত নয় যা স্ক্রিপ্টগুলিকে প্রভাবিত করবে, যেহেতু এটি স্ক্রিপ্টগুলি ভেঙে দিতে পারে।


6
rm-Iআমি ব্যবহার করেছি এবং সুপারিশ করেছি একটি বিকল্প আছে : "তিনটি বেশি ফাইল মুছে ফেলার আগে একবার অনুরোধ করুন বা পুনরাবৃত্তভাবে সরানোর সময় অনুরোধ করুন; -iএখনও বেশিরভাগ ভুলের বিরুদ্ধে সুরক্ষা দেওয়ার সময়" কম দেখান "
রেড

9
আমি দৃ strongly ়ভাবে সিপি এবং এমভি পুনরায় Aliasing না সুপারিশ । যাইহোক, -iতাদের কাছে ডিফল্ট যুক্তি হিসাবে ব্যবহার করা একটি দুর্দান্ত ধারণা, তবে এটি মূল নামগুলি নয় (উদাহরণস্বরূপ আমি সর্বদা alias copy="cp -i"এবং alias move="mv -i"আমার .bashrc এ রেখেছি) বিভিন্ন উরফ নামে প্রয়োগ করা উচিত । কেন? ব্যর্থতা মোড কারণ। আপনি যখন কোনও মেশিন বা বিভিন্ন ব্যবহারকারী ব্যবহার করেন যার সিপি / এমভি এলিয়াস নেই? ফাইলগুলি সম্ভাব্যভাবে অজান্তেই ওভাররাইট করা (সম্ভবত সনাক্ত করা যায় না!)। অনুলিপি মোডের সাথে অনুলিপি / মুভ উপন্যাসের সাথে সম্পর্কিত: শেল অভিযোগ করে যে এটি আদেশটি স্বীকৃতি দেয় না।
hlovdal

1
সিপি / এমভি এলিফের জন্য অতিরিক্ত ব্যর্থতা মোড রয়েছে: শিল স্ক্রিপ্ট লেখার সময় সিপি = "সিপি-আই" ওরফে ব্যবহার করা কোনও সিপি কমান্ড ভুলভাবে লিখতে পারে এটি ইন্টারেক্টিভ মোডে যেমন আচরণ করবে বলে আশা করে কারণ সেখানে নেই নামের পার্থক্য। বিপরীতে, আমি যখনই লিখি "কপির কিছু সোফিল / কিছু / যেখানে" আমি জানি যে আমি সরাসরি কোনও সিপি কমান্ড নয় বরং একটি উপনাম ব্যবহার করি। এমনকি শেল ফাইলে আমার যদি একটি অনুলিপি রাখা হয় তবে এটি একইভাবে ব্যর্থ হবে যেটি হারিয়ে যাওয়া উরফ সহ শেলের জন্য।
hlovdal

1
সুতরাং -iসিপি এবং এমভি-র জন্য যুক্তিটি ব্যবহারের জন্য ডিএল ডিফল্টর পরামর্শটি দুর্দান্ত তবে সিপি এবং এমভি নামগুলি পুনরায় ব্যবহার করার পরামর্শটি অত্যন্ত খারাপ rib এটা খুব খারাপ আমি উত্তর একটি ডাউন ভোট দিতে হবে। দয়া করে বিভিন্ন উপনামের নাম ব্যবহার করতে পরিবর্তন করুন এবং আমি এটির পক্ষে একটি ভোট দেব।
hlovdal

1
@ টমহেল আপনি ব্যবহার করতে পারেন alias RM='command rm', যা zsh কে উলামের rmপরিবর্তে বাহ্যিক কমান্ড ব্যবহার করতে বলবে । এইভাবে আপনাকে --interactive=neverকোনও পূর্ববর্তী সুপারসাইডের উপর নির্ভর করতে হবে না -i
অ্যাডেফন

6

সেট noclobberশেল বিকল্প ~/.bashrc(জন্য bash) অথবা ~/.zshrc(অথবা আরো স্পষ্ট করে $ZDOTDIR/.zshrc, জন্য zsh) এটিকে ইন্টারেক্টিভ শেল সেশনে সক্রিয় করতে হবে।

অ-ইন্টারেক্টিভ শেল (স্ক্রিপ্ট) এই ফাইলগুলি পড়ে না।

শেল বিকল্পগুলি প্যারেন্ট শেলগুলি থেকে সাধারণত উত্তরাধিকার সূত্রে প্রাপ্ত হয় না।

এর অর্থ হ'ল স্ক্রিপ্টগুলি সেই ফাইলগুলিকে সুস্পষ্টভাবে উত্স না দিলে আপনার বিদ্যমান স্ক্রিপ্টগুলিতে আচরণটি পরিবর্তন না করে files ফাইলগুলিতে বিকল্প সেট করতে সক্ষম হওয়া উচিত।

আমি দেখতে পাচ্ছি এটি করার একমাত্র কুফল হ'ল আপনি বারবার ভুলে যাবেন যে আপনি অন্তত শুরুতে বিকল্পটি সেট করেছেন। পরবর্তীতে, সব জিনিস এই ধরনের সঙ্গে, আপনি অভ্যাসগত ভাবেই ব্যবহার শুরু হবে >|, এমনকি ক্ষেত্রে যেখানে আপনি আসলে ফাইল (ঠিক alias লেখা ব্যক্তিদের মত পরাস্ত করতে চান পারে rm, cpএবং mvসঙ্গে -iবিকল্প সবসময় সেট, অবশেষে সবসময় ব্যবহার করা শুরু করুন -fকমান্ড লাইনে)।


2
এর সাথে bash, বিকল্পগুলি উত্তরাধিকার সূত্রে প্রাপ্ত হয় $SHELLOPTS( যদি এটির $BASHOPTSজন্য shopt) পরিবেশে থাকে (তবে আপনি সাধারণত কিছু করতে চাইবেন না তবে এই জাতীয় কারণেই)।
স্টাফেন চেজেলাস

3

নেতিবাচকতাটি হ'ল, যদি আপনি noclobberসক্রিয় হয়ে উঠতে অভ্যস্ত হন , আপনি একদিন এমন একটি সিস্টেম ব্যবহার করবেন যেখানে এটি সক্রিয় নয় এবং আপনি আপনার সম্ভাব্য-বিপজ্জনক আদেশটি নির্দ্বিধায় কার্যকর করবেন, noclobberআপনাকে বাঁচানোর আশায় ... এবং তা হবে না। এবং তারপরে আপনাকে আশা করতে হবে যে আপনার ধ্বংস করা ডেটা পুনরুদ্ধার করার জন্য সাম্প্রতিক পর্যায়ে যথেষ্ট ব্যাকআপ রয়েছে কারণ আপনি ধরে নিয়েছিলেন যে আপনাকে প্রথমে নিশ্চিতকরণের জন্য জিজ্ঞাসা করা হবে।


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