শেলটি কি অপ্রয়োজনীয় সমাপ্তি আদেশগুলি অপ্টিমাইজ করার অনুমতি দেয়?


27

যদি কোনও শেলকে সম্ভবত অবর্থহীন ( বা আংশিকভাবে অকেজো ) কমান্ডটি করতে বলা হয়, যেমন cat hugeregularfile.txt > /dev/null, এটি কমান্ডের প্রয়োগ কার্যকর করতে পারে ( বা একটি সস্তা সমতুল্য নির্বাহ করুন, বলুন touch -a hugeregularfile.txt )?

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

সম্পাদনা

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


না, শেলটি আধুনিক সংকলকগুলির মতো স্মার্ট নয় । আসলে, এটি বরং বোবা। এটি কোনও অকেজো কোড অনুকূলিত করবে না।
ডেভনুল

12
ব্যবহারকারীর উদ্দেশ্য কী তা অনুমান করা শেলটি করা উচিত নয়। ব্যবহারকারী সেই কমান্ডটি দিয়ে প্রায় কিছু করার চেষ্টা করতে পারে, এটি সম্ভব করেও এটি অপ্টিমাইজ করা ভুল কাজ হবে।
ক্রিস ডাউন

1
বলার অপেক্ষা রাখে না যে ফাইলটি যদি কোনও ডিভাইস ছিল তবে catএটির সাথে সংযুক্তি করা একটি বড় পার্থক্য করে। শেলটি জানতে পারে যে ফাইলটি একটি ডিভাইস, তবে এটি নির্ভরযোগ্য হওয়ার দরকার নেই।
ইয়ো '

3
@ স্টাফেনচাজলাস সি সংকলকদের সংকলিত প্রোগ্রামগুলি অনুকূল করতে "কারও কাছ থেকে অনুমতি চাইতে হবে" না; সি স্ট্যান্ডার্ডে একটি বিধি - বিধান রয়েছে যা তাদের এটি করার অনুমতি দেয়। POSIX মান প্রদর্শিত হয় অন্তত একটি শেল (আদর্শায়িত করেছেন pubs.opengroup.org/onlinepubs/009695399/utilities/... ), সেইসাথে অনেক অন্যান্য ইউটিলিটি ( pubs.opengroup.org/onlinepubs/009604499/utilities/wc.html জন্য wc, এই ক্ষেত্রে). তবে আমার জ্ঞানের সেরাটি পসিক্স শেল অপ্টিমাইজেশনের বিষয়ে অবস্থান নেয় না; নাকি তা করে?
আইভিলনোটেক্সিস্ট আইডোনোটেক্সবাদ

2
অপ্টিমাইজেশন কার্যকারিতা প্রভাবিত না করে শর্টকাটগুলির সাথে কর্মক্ষমতা উন্নত করছে। যতক্ষণ কার্যকারিতা গ্যারান্টিযুক্ত, আমি পসিক্স আপত্তি দেখতে পাচ্ছি না। আপনার প্রস্তাবিত অপ্টিমাইজেশন যদিও বিড়াল স্পষ্ট বিরতি হবে । পসিক্স স্পেকে নির্দিষ্ট শব্দাবলি রয়েছে যা দ্বারা করা অপ্টিমাইজেশনের ধরণকে সামঞ্জস্য করতে পারে ksh। তারা পৃথক প্রক্রিয়া বলে না তবে কাঁটাচামচ অপ্টিমাইজেশনের অনুমতি দেওয়ার জন্য সাবস্কেল পরিবেশ বলে।
স্টাফেন চেজেলাস

উত্তর:


26

না, এটি একটি খারাপ ধারণা হবে।

cat hugeregularfile.txt > /dev/nullএবং touch -a hugeregularfile.txtএক নয়। catআপনি আউটপুটটিতে পুনর্নির্দেশ করলেও পুরো ফাইলটি পড়বে /dev/null। এবং পুরো ফাইলটি পড়া আপনি সম্ভবত যা চান তা হতে পারে। উদাহরণস্বরূপ এটি ক্যাশে করার জন্য যাতে পরবর্তী পাঠাগুলি উল্লেখযোগ্যভাবে দ্রুত হয়। শেল আপনার উদ্দেশ্য জানতে পারে না।

একইভাবে, কোনও সি সংকলক কোনও ফাইল পড়া কখনই অনুকূলিত করবে না, এমনকি আপনি যে স্টাফটি পড়েছেন তার দিকে নজর না দিলেও।


2
@ আইভিলনোটেক্সিস্ট: প্রতিটি দরকারী কমান্ডের (তর্কাতীতভাবে trueএবং ব্যতীত false) সম্ভাব্য পার্শ্ব প্রতিক্রিয়া থাকে এবং পার্শ্ব প্রতিক্রিয়াগুলি প্রায়শই সর্বদা কমান্ডটি আহ্বানের মূল বিষয় হয়। শেলটি পার্শ্ব প্রতিক্রিয়াগুলি (যেমন বাহ্যিক প্রোগ্রামগুলির জন্য cat) হ্যালটিং সমস্যা সমাধান না করে আগেই জানতে পারে না । সুতরাং এটি যথাযথভাবে চেষ্টা করে না, এবং ধরে নেয় যে আপনি যা বলেছিলেন তা বোঝানো হয়েছে।
সিএইচও

5
IwillnotexistIdonotexist না, শেলটি যা ঘটছে তা সব দেখতে পাবে না। এটি সম্পর্কে কোনও ধারণা নেই cat। প্রকৃতপক্ষে, catআপনার হার্ড ড্রাইভের ফর্ম্যাট করা থেকে শুরু করে ইন্টারনেট ডাউনলোড করতে কিছু করতে পারে।
স্কাই

5
"ইউনিক্স তাদের ব্যবহারকারীদের বোকা কাজ করা থেকে বিরত করার জন্য ডিজাইন করা হয়নি, কারণ এটি তাদের চালাক জিনিসগুলি করা থেকে বিরত রাখবে।" - ডগ গুইন
এজি হ্যামার্থিফ

7
@cHao এমনকি trueএবং falseসেট $?
কাইল স্ট্র্যান্ড

3
@ স্কাই যেমন উপরে উল্লেখ করেছেন, এক্সিকিউটেবলগুলি ভাষা কীওয়ার্ডগুলির মতো নয়: catএবং এর /dev/nullসাধারণ অর্থ রয়েছে তবে সেগুলি সেভাবে আচরণের গ্যারান্টিযুক্ত নয় । প্রত্যাশিত আচরণে কোনও পরিবর্তন না হওয়ার গ্যারান্টি দেওয়ার সময় অপ্টিমাইজেশান সম্পাদন করার জন্য, অপ্টিমাইজেশানটি কেবল শেলের মধ্যেই বাস্তবায়িত কনস্ট্রাক্টগুলিকে অনুমোদিত হতে পারে এবং কার্যকরকরণের পরিবেশে পাওয়া জিনিসগুলি পাওয়া যায় না ... তাদের নামগুলি যতটা স্বজ্ঞাত মনে হোক না কেন।
andybuckley

20

না, যেহেতু /dev/nullকেবল একটি নাম, যা অন্য কোনও ডিভাইসের জন্য বা "সাধারণভাবে" ডেটা ডুবন্ত ছাড়া অন্য কোনও ফাইলের জন্য ব্যবহৃত হতে পারে।

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

সি প্রোগ্রামে কোড অফ অপ্টিমাইজ করার সাথে আপনার তুলনা কাজ করে না, কারণ শেলের শপের সোর্স কোডের এক অংশের উপরে মোট সংক্ষিপ্ত বিবরণ নেই। শেল /dev/nullআপনার উদাহরণ দূরে অপ্টিমাইজ করার জন্য যথেষ্ট পরিমাণে জানে না , যেমন কোনও সি কম্পাইলার ফাংশন কলটিতে কোড সম্পর্কে যথেষ্ট পরিমাণে জানে না কলটি না করার জন্য এটি ডায়নামিকভাবে লিঙ্ক করে।


4
দেখা যাচ্ছে যে, ksh93 /dev/nullকখনও কখনও বিশেষভাবে চিকিত্সা করবে । একটি বিল্টিন যা তার স্টাডাউটকে নির্দেশিত করেছে /dev/null, উদাহরণস্বরূপ echo foo >/dev/null, কোনও লেখার ফলস্বরূপ হবে না /dev/null। এটি কোনও বিল্টিন-কমান্ড (যেমন cat file >/dev/null) ব্যবহার করে যদি এটি বিশেষ কিছু করে না ।
মার্ক প্লটনিক

সত্য বিষয়, catএছাড়াও অন্য কিছু হতে পারে। আসলে অন্য কিছু।
প্রাচীর

3
আসলে /dev/nullখুব কম এক প্রমিত পাথ , সহ /dev/tty, /dev/console, /tmp, /dev/এবং /
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

2
@MarkPlotnick বাস্তবিক cat হয় একটি ksh93 builtin (না সক্রিয়, যদি না আপনি করা /opt/ast/binআগে /bin(অথবা যেখানেই থাকুন না কেন কোন catপাওয়া যায়) $PATH)। এবং হ্যাঁ, যদিও cat file > /dev/nullযে builtin কিছু করে readবিষয়বস্তু file, এটা নেই না এটা লিখতে, / dev / নাল (এটা প্রর্দশিত এবং এটি fstats যদিও)।
স্টাফেন চেজেলাস

14

এটি চলমান কমান্ডগুলি অপ্টিমাইজ করবে না (এবং ইতিমধ্যে আপনি কেন এটি করা উচিত নয় তা জানিয়ে বেশ কয়েকটি উত্তম উত্তর পেয়েছেন) তবে এটি কাঁটাচামচ, পাইপ / সকেটপেইরগুলি অপ্টিমাইজ করতে পারে, কিছু ক্ষেত্রে পড়ে। এটি যে ধরণের আশাবাদী হতে পারে:

  • বেশিরভাগ আধুনিক শেলগুলির সাথে, কোনও স্ক্রিপ্টের শেষ কমান্ডটি শেল প্রক্রিয়ায় কার্যকর করা হবে যদি না কিছু trapসেট করা থাকে। মধ্যে উদাহরণস্বরূপ sh -c ls, অধিকাংশ shবাস্তবায়ন ( bash, mksh, ksh, zsh, yashএর কিছু সংস্করণগুলিতে ash) চালানোর জন্য একটি প্রক্রিয়া মাল করা হবে না ls
  • ইন ksh93, কমান্ড প্রতিস্থাপন কোনও বাহ্যিক কমান্ড না বলা পর্যন্ত পাইপ তৈরি বা কাঁটাচামচ তৈরি করবে না ( $(echo foo)উদাহরণস্বরূপ fooপাইপ / সকেটপায়ার বা কাঁটাচামচ ছাড়াই প্রসারিত হবে )।
  • readবিল্ট-ইন কিছু শাঁস এর ( bashAT & T ksh) করবে না একক বাইট লেখা যদি তারা শনাক্ত stdin seekable আছে (যে ক্ষেত্রে তারা বৃহৎ সার্চ করে এবং যা তারা পড়তে বোঝানো হয় শেষে ফিরে চাইতে হবে)।

আমি এই উত্তরটি পছন্দ করি তবে এটি স্পষ্ট নয় যে এটি আসল কারণ, বা তথ্যটি কোনও রেফারেন্স থেকে নেওয়া হয়েছে কিনা (যা আমি জানাতে চাই)
yoniLavi

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

1
@ হেনকলেঙ্গেলওয়েল্ড, হ্যাঁ, আপনি যাচাই করতে পারেন sh -c 'ps -p "$$"'যা আপনাকে যা বাস্তবায়নের সাথে সাথে psএবং বাস্তবায়নের সাথে বা স্ট্রেস / ট্রাস / টাস্ক দিয়ে দেয় না ...shsh
স্টাফেন

1
মধ্যে পার্থক্য ksh -c 'ps; ps'এবং ব্যাশ -c 'PS; PS' আকর্ষণীয়। Ksh93 এর অপ্টিমাইজেশনে আরও যায়।
হেন্ক ল্যাঙ্গভেল্ড

1
@ হেনকলেঙ্গেলওয়েড, নির্ভর করে যে kshআমরা এখানে কী কী প্রয়োগের কথা বলছি। mkshমত আচরণ করে bash। এই আচরণটি বেশিরভাগ ক্ষেত্রে পছন্দসই করে তোলে system("some command")। মনে রাখবেন যে যখন কোনও সিগন্যাল (কিছু শেলস) দ্বারা সমাপ্ত প্রক্রিয়াগুলির প্রস্থান স্থিতি আসে তখন সেই অপ্টিমাইজেশনের একটি পার্শ্ব প্রতিক্রিয়া থাকে। ksh93একটি বাগ থাকতে পারে এটি ফাঁদগুলি সেট করা হওয়ার পরেও এটি অপ্টিমাইজেশন করছিল।
স্টাফেন চেজেলাস

7

যখন দেখা যায় cat hugeregularfile.txt > /dev/null, শেলটিকে বিশ্বাস করা যায় না যে ক্রিয়াটি অকেজো - catএটি শেলের অংশ নয় এবং তাত্ত্বিকভাবে এবং অনুশীলনেও কিছু করতে পারে।

উদাহরণ হিসেবে বলা যায়, ব্যবহারকারী এক্সিকিউটেবল নতুন নামকরণ হয়ে থাকতে পারে rmথেকে catআর হঠাৎ লাইন সঞ্চালিত বাইরে পর্যবেক্ষণযোগ্য আচরণ, অর্থাত, ফাইল মুছে ফেলার।

ব্যবহারকারী catএটির একটি সংস্করণ একটি অনন্ত লুপের মধ্যে সংকলিত করে থাকতে পারে , সুতরাং শেলটি ধরে নিতে পারে না যে এটি আপনার প্রস্তাব অনুসারে এটি 'সমাপ্তি হিসাবে পরিচিত'।

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


2
আসলে, এটি একটি বিল্টিন তৈরি করে mkshবাস্তবে অনুকূলিত V=$(cat file)করে তোলে। সুতরাং শেলটি এটি অনুকূল করে তুলতে পারে তবে এটিকে কেবল একটিতে রূপান্তরিত করবে না touch -a
স্টিভ স্নেপ

1
@SteveSchnepp, cat হয় একটি builtin mkshকিন্তু সিস্টেমে ঐ builtin রিসর্ট এর catযদি থাকে বিকল্প, যা গনুহ সঙ্গে কেন পাস cat, mksh -c 'cat /dev/null --help'হিসাবে একই ফল নেই bash -c 'cat /dev/null --help', কিন্তু mksh -c 'cat --help /dev/null'আপনি একই দিতে না bash -c 'cat --help /dev/null'(যেমন mkshপার্স অপশন POSIX builtin বিড়াল উপায়, যখন GNU বিড়াল তাদের GNU পথে পার্স করে)।
স্টাফেন চেজেলাস

ব্যাশ এবং ksh93 এ, এর V=$(cat file)সাথে অনুকূলিত হতে পারে V=$(< file)। এটি বিল্টিন ছাড়াও জিনিসগুলিকে গতি দেয় cat
হেন্ক ল্যাঙ্গভেল্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.