কেন এমকেডির নেস্টেড ডিরেক্টরি তৈরির অনুমতি দেওয়ার জন্য ডিফল্টরূপে -p পতাকা সেট করে না?


11

-pপতাকাটি mkdirডিফল্টরূপে সেট না করার কোনও কারণ আমি দেখতে পাচ্ছি না ।

  -p, --parents     no error if existing, make parent directories as needed

আমি যা দেখতে পাচ্ছি তা থেকে এটি একটি অ-ধ্বংসাত্মক আদেশ। আমি কীভাবে এই কাজ করে সে সম্পর্কে গুরুত্বপূর্ণ কিছু মিস করেছি?

দ্বিতীয়ত এটির ডিফল্ট আচরণ হতে কোনও সহজ উপায় আছে mkdir?


2
আপনার .bashrc এই করা: alias mkdir="mkdir -p"
কেভিন 17

সব পরে আলোচনা আমি সিদ্ধান্ত নিয়েছি একজন ওরফে সঙ্গে যেতেmkdp
Treffynnon

উত্তর:


6

এটি একটি alচ্ছিক বৈশিষ্ট্য, এটি সর্বদা পছন্দ হয় না - বিশেষত স্ক্রিপ্টগুলিতে। স্ক্রিপ্টগুলির ক্ষেত্রে নিম্নলিখিত ত্রুটিগুলি বিবেচনা করুন:

  • ডিরেক্টরিটি ইতিমধ্যে বিদ্যমান রয়েছে বলে প্রতিবেদন করা হয়নি: কোনও স্ক্রিপ্ট যদি নতুন তৈরি করা ডিরেক্টরিতে কিছু ফাইল রাখার কথা মনে করে এবং সেই ডিরেক্টরিটি ইতিমধ্যে বিদ্যমান এবং এতে ফাইল রয়েছে তবে স্ক্রিপ্টটি প্রচুর গোলযোগ করতে পারে। (স্ক্রিপ্ট দ্বারা সেখানে রাখা ফাইলগুলি পরে ফিল্টার আউট করা কঠিন হবে))
  • উপরের ফ্লিপ-সাইডে, কিছু স্ক্রিপ্ট (বা এর কিছু অংশ) সম্ভবত পূর্বে নির্মিত ডিরেক্টরি কাঠামোর উপর নির্ভর করে (সম্ভবত অন্য প্যাকেজ / স্ক্রিপ্ট দ্বারা)। উদাহরণস্বরূপ, প্যাকেজ ইনস্টলেশন স্ক্রিপ্টটির জন্য একটি সাবডির মধ্যে লাইব্রেরি রাখার প্রয়োজন হতে পারে /usr/local/lib/GreatSoftware/ImportantPartOfItতবে লাইব্রেরিগুলি স্টাফের / লিঙ্কের উপর নির্ভর করে /usr/local/lib/GreatSoftware। যদি এটি অনুপস্থিত থাকে তবে স্ক্রিপ্টটি চালিয়ে যাওয়া উচিত নয়।

এর জেনেরিক আচরণ mkdirএটিকে সহজ এবং প্রাকৃতিক করে তোলে, কারণ এই জাতীয় পরিস্থিতিতে রিপোর্ট করা হয় এবং সরাসরি তা ধরা পড়ে।


আপনি যদি সর্বদা mkdir -pআপনার শাঁস ব্যবহার করতে চান তবে আপনি এটির জন্য একটি নাম রাখতে পারেন :

alias mkdir='mkdir -p'

(এটি আপনার .bashrcবা যে কোনও কনফিগার শেল ব্যবহার করে to


1
আমি এটি একটি মানহীন পদ্ধতিতে আচরণ করার জন্য একটি স্ট্যান্ডার্ড কমান্ডের পরামর্শ দেব না। এটি স্ক্রিপ্টগুলি বহনযোগ্য নয় এবং পাঠকদের বিভ্রান্ত করতে পারে। একটি নতুন উপন্যাস বা ফাংশন তৈরি alias mkdp="mkdir -p"করা আরও পরামর্শ দেওয়া উচিত।
jlliagre

2
@jlliagre না, এটি স্ক্রিপ্টগুলিতে প্রভাব ফেলবে না। স্থানীয়ভাবে সংজ্ঞায়িত উপমাগুলি .bashrc(সাধারণত) তাদের পরিবেশকে প্রভাবিত করে না।
rozcietrzewiacz

সত্যই তবে আপনি আমার বক্তব্য মিস করেছেন। এমনকি আপনার নিজের ব্যবহারের জন্য, তার আচরণ পরিবর্তন করার জন্য একটি স্ট্যান্ডার্ড কমান্ডকে আলাদা করা কোনও প্রস্তাবিত অনুশীলন নয়। সর্বব্যাপী হওয়া সবচেয়ে খারাপ উদাহরণ alias rm='rm -i'
jlliagre

1
@jlliagre কার দ্বারা প্রস্তাবিত নয়? ;) তবে হ্যাঁ, আমি একমত, আমি নিজেই বরং আলাদা আলাদা উপন্যাস ব্যবহার করব - তবে ব্যবহারিক, আদর্শিক কারণে নয়। আমিও মনে করি না যে rm -iউপনামটি সর্বদা খারাপ - যদিও এটি খারাপ অভ্যাসের কারণ হতে পারে। অবশ্যই সমস্ত কমান্ড উপকরণ সমানভাবে ভাল / খারাপ নয় - বিবেচনা করুন ls="ls --color=auto"বা ssh="TERM=xterm ssh"উদাহরণ হিসাবে।
rozcietrzewiacz

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

16

অবশ্যই একটি তর্ক করতে পারে যে পিতামাতুল্য ডিরেক্টরি তৈরি করা ডিফল্ট হওয়া উচিত এবং যদি পিতামাতার অস্তিত্ব না থাকে তবে ডিরেক্টরি তৈরি রোধ করতে কিছু চেক বিকল্প ব্যবহার করা যেতে পারে।

তবে কেন এটি অন্য উপায়ে রয়েছে কেবল ইতিহাস। Mkdir এর মূল সংস্করণ পিতামহিত ডিরেক্টরি তৈরি করে নি। এই কারণেই এক্স 11 ডিস্ট্রিবিউশনগুলি mkdirhier নামে একটি কমান্ড নিয়ে এসেছিল যা এই কাজটি সম্পাদন করতে সক্ষম হয়েছিল: মূল ডিরেক্টরি উপস্থিত রয়েছে কিনা তা পরীক্ষা করে দেখুন এবং প্রয়োজনীয় হলে সেগুলি তৈরি করুন।

পরে এই কার্যকারিতাটি mkdir কমান্ডে অনেকগুলি ইউনিক্স সংস্করণে যুক্ত করা হয়েছিল (আমি জানি না এটি আজকাল পসিক্স স্ট্যান্ডার্ডে আছে কিনা)। সামঞ্জস্য বজায় রাখার জন্য এই বৈশিষ্ট্যটি একটি বিকল্প পতাকা চালু করার মাধ্যমে উপলব্ধ করা হয়: -p

এটি ডিফল্টরূপে চালু করা খারাপ কেন? স্ক্রিপ্টগুলি পিতা-মাতার ডিরেক্টরি উপস্থিত না থাকলে mkdir ব্যর্থ হওয়ার উপর নির্ভর করতে পারে। বিশেষত ব্যবহারকারী রুট হিসাবে এটি ডিফল্টরূপে ডিরেক্টরি ট্রি তৈরি করা বিপজ্জনক হতে পারে।

উদাহরণ:

 if mkdir /backup/$(uname -n)/$(date +%Y%m%d)
  then
    perform_backup ...

এই উদাহরণে ডিরেক্টরিটি তৈরি হবে এবং ব্যাকআপটি সম্পাদিত হবে এমনকি ফাইল সিস্টেমটি /backupমাউন্ট করা হয়নি এবং পিতামাতার /backup/$(uname -n)অস্তিত্ব নেই যদি অন্যদিকে ডিফল্টটি অন্যভাবে হয়ে থাকে।

থাম্বের বিধি: কোনও সরঞ্জামের ডিফল্ট আচরণ পরিবর্তন না করা ভাল অনুশীলন। যদি ইচ্ছা হয় তবে ডিফল্ট আচরণ পরিবর্তন করার জন্য বিকল্পগুলি সরবরাহ করুন।


2
আপনি এখানে ব্যবহার করেছেন মাউন্ট উদাহরণটি পছন্দ করি। আমি সেই বিশেষ দৃশ্যের কথা ভাবিনি।
ট্রেফিনন

1
-P (এবং-মি) বিকল্পগুলি 1983 সালে সিস্টেম ভি দ্বারা প্রবর্তন করা হয়েছিল Both দুটিই অবশ্যই পসিক্স স্ট্যান্ডার্ডের অংশ।
jlliagre

4

আমি মনে করি, এটি দয়ালু দর্শন। খালি mkdir (1) কমান্ড (বিকল্প ব্যতীত) mkdir (2) সিস্টেম কল উপস্থাপন করে, শেলটিতে এর কার্যকারিতা সরবরাহ করে, কম বা বেশি কিছু করে না।


4

ইন শুরুতে মাত্র বেয়ার ছিল mkdirকমান্ড। ইউনিক্সের নকশার নীতিমালা অনুসারে, এই সাধারণ কমান্ডটি একটি সাধারণ কাজ সম্পাদন করেছে: একটি ডিরেক্টরি তৈরি করা।

পরবর্তীতে, সাধারণ ব্যবহারের ক্ষেত্রে হ্যান্ডেল করার জন্য mkdirএকটি -pবিকল্প অর্জন করা হয়েছে যেখানে কলার শূন্য, একটি বা একাধিক ডিরেক্টরি তৈরি করতে চান যাতে একটি নির্দিষ্ট পাথ বিদ্যমান ensure এটি বেশ কয়েকটি কারণে ডিফল্ট অপারেশন করা হয়নি। প্রথমত, সমস্ত সিস্টেমে এই জটিল বৈশিষ্ট্য ছিল না, এবং -pবিকল্পটির প্রয়োজনের অর্থ হ'ল যে স্ক্রিপ্টগুলি এটি ব্যবহার করে তা mkdir: invalid option -zমাঝে মাঝে ডিরেক্টরি তৈরি করতে অদ্ভুতভাবে ব্যর্থ হওয়ার পরিবর্তে যুক্তিসঙ্গত ত্রুটি বার্তা (যেমন কিছু ) পেয়ে যেত । দ্বিতীয়ত এবং সবচেয়ে গুরুত্বপূর্ণ, এর আচরণটি সব ক্ষেত্রেই mkdir -pউপযুক্ত নয় প্রতিস্থাপন mkdir

বিশেষত, বেশিরভাগ ফাইল সিস্টেমে mkdirএটি একটি পারমাণবিক অপারেশন । যদি কোনও প্রোগ্রাম চলে mkdir playgroundএবং কমান্ড সফল হয়, প্রোগ্রামটি জানে যে এটি playgroundডিরেক্টরি তৈরি করেছে । এটি প্রোগ্রামটিকে নতুন ডিরেক্টরিটিকে তার একচেটিয়া খেলার মাঠ হিসাবে বিবেচনা করার অনুমতি দেয়: একই প্রোগ্রামটির আর একটি উদাহরণ যদি একই সাথে চলতে থাকে তবে তার কলটি mkdir playgroundব্যর্থ হবে। এই সম্পত্তিটি তত্ক্ষণাত mkdir -pযুক্তির অস্তিত্বের অনুমতি দেয় বলে সরবরাহ করা হয় না।

যদি mkdir -pশুরু থেকে অস্তিত্ব থাকে তবে mkdir -aএটি সিঙ্গল-ডিরেক্টরি তৈরি কমান্ডের মতো কিছু দিয়ে ডিফল্ট মোড তৈরি করা যেত । তবে এটি সাধারণ ইউনিক্স ডিজাইনের দর্শন অনুসরণ করতে পারত না: বেশিরভাগ মৌলিক ইউটিলিটিগুলি ফ্যানসিয়ার আচরণের সাথে অন্তর্নিহিত আদিমগুলির চারপাশে সাধারণ মোড়ক (যেমন একসাথে একাধিক ডিরেক্টরি তৈরি করার মতো) অভিনব বিকল্পগুলির প্রয়োজন হয়।


2

আমার কাছে বিষয়টি হ'ল -পি বিকল্পের আচরণটি যদি এটি ডিফল্ট হয় তবে এটি অবশ্যই পার্শ্ব প্রতিক্রিয়া। আপনি যা করতে বলেছিলেন তাতে অতিরিক্ত কিছু করে এটি কোনও আদেশে জটিলতা যুক্ত করে। এটি মনে রাখা আরও একটি অদৃশ্য জিনিস। সাউন্ড প্রোগ্রামিং অনুশীলনের প্রাথমিক নিয়মগুলির মধ্যে একটি হল পার্শ্ব প্রতিক্রিয়া এড়ানো avoid

আধুনিক প্রোগ্রামিং ল্যাঙ্গুয়েজগুলি এত শক্তিশালী যে কোনও ভাষা উপলব্ধ আদিমদের থেকে আপনার যে কোনও জটিল কমান্ডের প্রয়োজন হতে পারে তা তুলনামূলকভাবে সহজ easy এটি করার মধ্যে কী আচরণের প্রয়োজন তা সম্পর্কে সচেতন সিদ্ধান্ত নেওয়া এবং এটি কী করা হয়েছে তার একটি দৃ concrete়, দৃশ্যমান রেকর্ড রেখে দেয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.