প্যাটার্ন কেন “কমান্ড || সত্য "দরকারী?


78

আমি বর্তমানে দেবিয়ান প্যাকেজগুলি অন্বেষণ করছি এবং আমি কিছু কোডের নমুনা পড়ছি। এবং প্রতিটি লাইনে উদাহরণস্বরূপ, postinstস্ক্রিপ্টটি একটি নিদর্শন ।

some command || true
another command || true

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


5
অবগতির জন্য, ||:লেখার এই (আরেকটি কথ্য উপায় :নির্দেশিত builtin টেবিল অন্য এন্ট্রি হচ্ছে trueকিন্তু - নিশ্চিত একটি builtin এমনকি ফিরে বোর্ন হতে; যে বলেন, POSIX SH জন্য, trueএকইভাবে একটি builtin হতে নিশ্চিত করা হয় - তাই এটা সম-দূরবর্তী-আধুনিক সময়ে দক্ষতার চেয়ে বেশি তীক্ষ্ণতা)।
চার্লস ডাফি

উত্তর:


151

এই প্যাটার্নটির কারণ হ'ল ডেবিয়ান প্যাকেজগুলির রক্ষণাবেক্ষণকারী স্ক্রিপ্টগুলি শুরু হয় set -e, যার ফলে কোনও কমান্ড (কঠোরভাবে বলা, পাইপলাইন, তালিকা বা যৌগিক কমান্ড) অ-শূন্য স্থিতি ছাড়ার সাথে সাথে শেলটি বেরিয়ে যায়। এটি নিশ্চিত করে যে ত্রুটিগুলি জমা না হয়: কিছু ভুল হওয়ার সাথে সাথে স্ক্রিপ্টটি বাতিল হয়ে যায়।

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

rmdir ... || true

যেহেতু rmdirত্রুটিগুলি উপেক্ষা করতে বলার কোনও বিকল্প নেই।


4
ঠিক আছে, set -eএকেবারেই দরকার নেই || true, প্রসঙ্গটি সরবরাহ করা আমার পক্ষে গুরুত্বপূর্ণ মনে হয়েছিল। আপনি যদি পাওয়ারের বিষয়ে অদ্ভুত জিনিসগুলি লক্ষ্য করেন, তবে আমি আপনাকে বাগ ( reportbug)) ফাইল করতে উত্সাহিত করছি !
স্টিফেন কিট

16
@ মিশেলফেল্ট, আসলে set -eকেবল "দেবিয়ান কনভেনশন" নয়, তবে একটি ভাল প্রোগ্রামিং প্যাটার্ন সর্বদা ব্যবহার করা উচিত। দেখা. উদাহরণস্বরূপ ডেভিডপ্যাশলি.আর্টিকেলস
কে

2
এখানে প্রশ্ন অনুযায়ী - || trueসেট- কেন ব্যবহারের সম্ভাবনা প্রসঙ্গ এবং সম্ভবত সবচেয়ে সাধারণ। এই জবাবের কাছে আমি প্রণাম! আক্ষরিকরূপে, এটি যে কোনও সময় প্রস্থান স্থিতিকে অপ্রাসঙ্গিক বলে মনে করা হয় এবং (যেমন আপনি নিবন্ধের লিঙ্কটি যুক্ত করেছেন) আমি আমার স্ক্রিপ্ট নিয়ন্ত্রণের অংশ হিসাবে প্রস্থান স্থিতিটি ব্যবহার করছি না useful আমি ইউটিলিটিটি দেখতে পাচ্ছি ( set -eতবে) নিবন্ধটি যতটা যায় না এবং বলে যে "আপনার লিখিত প্রতিটি স্ক্রিপ্টের শীর্ষে সেট-ই অন্তর্ভুক্ত করা উচিত"। এটি প্রোগ্রামিংয়ের একটি স্টাইল। "সবসময় | প্রতিটি" এর মধ্যে এটি ফাঁদগুলির নিজস্ব সেট অন্তর্ভুক্ত করে - ওরফে - বিস্মৃত পুনরায়: ওয়াইল্ড-কার্ড সমাধানগুলি ALWAYSঅবশেষে ওরফে ব্যাকফায়ার করবে - কোনও নিখরচায় নয়।
মাইকেল

1
@ কে এটি বর্তমানে একটি জনপ্রিয় দৃষ্টিভঙ্গি তবে শেষ পর্যন্ত এমন অনেক অনুমানের দ্বারা উদ্বেগিত হয়েছে যা স্ক্রিপ্টটির বহনযোগ্যতা সীমাবদ্ধ করে। set -eআচরণের সাথে historicalতিহাসিক অসঙ্গতি রয়েছে । আপনার পক্ষে লক্ষ্যমাত্রা নেই, যদি কেবলমাত্র আপনার লক্ষ্যমাত্রা bashএবং অন্যান্য অপেক্ষাকৃত সাম্প্রতিক শেলগুলি বাস করে /bin/shতবে আপনি যখন পুরানো শেল / সিস্টেমগুলি সমর্থন করতে চান তখন পরিস্থিতি আরও সংকুচিত হয়।
mtraceur

2
পুনঃটুইট সোভেন মাসচেকের বিভিন্ন শেলের set -eআচরণের নথিভুক্ত করার জন্য একটি খুব পুস্তক পৃষ্ঠা রয়েছে , যদিও এই পৃষ্ঠাতে আজ অনেক page তিহাসিক / প্রাচীন শাঁস অপ্রাসঙ্গিকভাবে নথিভুক্ত করা হয়েছে। : এছাড়া ( "-e সেট" এর জন্য অনুসন্ধান) একটি সংকীর্ণ আধুনিক ফোকাস সঙ্গে এই দুটি পৃষ্ঠা এর "lintsh" পৃষ্ঠা , > Builtins উপপৃষ্ঠা সীমা - autoconf এর পোর্টেবল শেল ডকুমেন্টেশন
mtraceur

32

যদিও এটি প্রোগ্রামের আউটপুটটিকে কেবল চালিত করতে প্রভাবিত করে না - এটি কলারকে এগিয়ে যাওয়ার অনুমতি দেয় যেন সমস্ত ঠিক আছে ওরফে ভবিষ্যতের যুক্তি প্রভাবিত করে।

পুনঃপ্রকাশিত: এটি পূর্ববর্তী কমান্ডের ত্রুটি স্থিতিটি মাস্ক করে ।

michael@x071:[/usr/sbin]cat /tmp/false.sh
#!/bin/sh
false

michael@x071:[/usr/sbin]cat /tmp/true.sh 
#!/bin/sh
false || true

michael@x071:[/usr/sbin]sh /tmp/false.sh; echo $?
1
michael@x071:[/usr/sbin]sh /tmp/true.sh; echo $? 
0

6
এটি সত্য, তবে কমান্ডের প্রস্থান স্থিতিটি কেন মাস্কিং কার্যকর তা উত্তর দেয় না।
Moopet

4
সেট-ই এর অর্থ হ'ল স্ক্রিপ্টটি তাত্ক্ষণিকভাবে শূন্য-শূন্য ফেরতের পরে বন্ধ হয়ে যাবে। আপনি সম্ভবত সেই স্থানীয় অবস্থানে থাকতে চান না!
রেক্যান্ডবোনম্যান

আমি একজন সাধারণ ব্যক্তি - এবং আমার জন্য ত্রুটির স্থিতিটি masেকে দেওয়ার একমাত্র কারণ হ'ল এটি "পথে"। আপনি যদি যত্ন না নিয়ে থাকেন তবে সেট-ই কোনওভাবে "ত্রুটি করে" makes আমি আলোচনাটি পছন্দ করি কারণ আমার স্ক্রিপ্টগুলি ডিবাগ করতে এবং ত্রুটির প্রতিক্রিয়া জানাতে অতিরিক্ত যুক্তি লেখার জন্য আমি এটি একটি দুর্দান্ত উপায় হিসাবে দেখছি (যেমন, || মুদ্রণ - "এক্সএক্সএক্স এখানে অ-শূন্যের অস্তিত্ব ছিল"। সম্ভবত আমার কাছে একটি আছে শেল ফাংশন 'মারাত্মক' এবং আমার কাছে "মারাত্মক" অসন্তুষ্ট আমাকে "কিছু আছে im তবে কোনও স্ক্রিপ্টের একটি ব্যর্থ স্থিতির রিপোর্ট করা উচিত, না যত্ন নেওয়া উচিত e প্লাস || সত্যই মাস্কিং ত্রুটি। এটিই যদি আমি চাই - জরিমানা, যদি তা না হয় তবে আমি ত্রুটিগুলি নিখোঁজ করছি
মাইকেল অনুভূত

আমার নিজেকে যা জিজ্ঞাসা করতে হবে তা হ'ল: || সত্য - একটি কোডিং ক্রাচ (একটি ত্রুটি ঘুরিয়ে দেওয়ার অতীতের উপায় / অতীতকে আমি এখনই মোকাবেলা করতে চাই না; একটি ডিবাগ সরঞ্জাম (-ও তবে কোনও সত্য নয়)) বা ভাল কোডিং অনুশীলন কী তা সম্পর্কে কেবল কারও ডগমা আছে other অন্য কথায় - আমি এটিকে একটি বৈশিষ্ট্য হিসাবে দেখছি - সম্ভাব্য উপকারের সাথে all সকলকে নিরাময়ের জন্য আমি এটিকে যাদুর কাঠি হিসাবে দেখছি না short সংক্ষেপে - ঠিক যেমন সৌন্দর্য দর্শকের চোখে রয়েছে - set -eএবং || trueইউটিলিটির বৈশিষ্ট্য এবং লক্ষ্যগুলি দ্বারা সংজ্ঞায়িত করা হবে প্রোগ্রামার।
মাইকেল অনুভূত

6
@ মিশেলফেল্ট বিবেচনা করুন: git remote remove foo || true git remote add foo http://blah- আমরা যদি রিমোটটি না থাকে তবে আমরা ত্রুটিটি উপেক্ষা করতে চাই।
ইমিগ্রিস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.