যা বাশ স্ক্রিপ্টে আরও মূর্খতাপূর্ণ: `|| সত্য` বা `|| : `?


36

আমি মারাত্মকভাবে শেল স্ক্রিপ্টিং করি না, তাই আমি যখন ডকুমেন্টেশনgit submodule পড়ছিলাম তখন আমি কিছুটা অবাক হয়েছিলাম এবং আমি এই ডকুমেন্টেশনে তাদের ব্যবহৃত সিনট্যাক্সটি দেখেছি:

যে কোনও সাবমডিউলে কমান্ড থেকে শূন্যহীন রিটার্ন প্রক্রিয়াকরণটি শেষ করে দেয়। || :কমান্ডের শেষে যুক্ত করে এটি ওভাররাইড করা যায়।

আমি উপরে দেখছি যে ছিল || :সফলভাবে থেকে প্রস্থান করার জন্য কমান্ড অত্যাচার জন্য একটি সাঁটে লেখার ছিল। যে কোনও সময় আমাকে কমান্ড সফলভাবে প্রস্থান করতে হয়েছিল, আমি ব্যবহার করেছি || true। হয় || :আরো কথ্য হিসেবে বিবেচনা করা?


এটি লক্ষণীয় যে ||:(কোনও স্থান ছাড়াই) ব্যাশেও বৈধ। এটি হিসাবে || :বা একই জিনিস করে || true
ব্রুনো ব্রোনোস্কি

উত্তর:


38

trueবোর্ন শেল মধ্যে নির্মিত হয় নি। :সর্বদা ছিল ( #পরিচয় করার আগে মন্তব্য প্রবেশ করার উপায় এটি ছিল )।

এটি, এবং এটি টাইপ করা সংক্ষিপ্ত কারণ সম্ভবত লোকেরা :বেশি পছন্দ করেন true

পসিএক্স শেলের আরও একটি পার্থক্য লক্ষ্য করুন ( bashকেবলমাত্র পসিক্স মোডে): যদিও trueএকটি নিয়মিত বিল্টিন (এমনকি বিল্টিনও তৈরি করতে হয় না), :এটি একটি বিশেষ বিল্টিন। এর কয়েকটি নিদর্শন রয়েছে, যার বেশিরভাগেরই এই বিশেষ ক্ষেত্রে কোনও প্রভাব পড়ার সম্ভাবনা নেই:

  • কোনও :কমান্ড যদি ব্যর্থ পুনঃনির্দেশের কারণে ব্যর্থ হয় তবে শেলটি প্রস্থান করতে পারে। অনুশীলনে, আপনি পুনর্নির্দেশগুলি পাস না করা হলে সম্ভবত এটি কোনও পার্থক্য করবে না:

    $ sh -c ': > /   ; echo HERE'
    sh: 1: cannot create /: Is a directory
    $ sh -c 'true > /; echo HERE'
    sh: 1: cannot create /: Is a directory
    HERE
  • ইন var=value :, রিটার্ন পরে varসেট করা থাকে না ক্ষেত্রে :value:true

    $ var=1; var=2 :   ; echo "$var"
    2
    $ var=1; var=2 true; echo "$var"
    1

এছাড়াও লক্ষ করুন যে পরিবার এবং পরিবারের || trueশেলগুলিতে কাজ করে তবে তা নয় (তবে এটি বাতিল করতে হবে না )।rccsh|| :set -ecsh

|| :যেমন হয় না :। এর অর্থ বা :অন্যথায় চালানো (এটি পূর্ববর্তী পাইপলাইন ব্যর্থ হলে)।

set -e
false

শেলটির কারণে বেরিয়ে আসার কারণ হবে set -eএবং falseএর শূন্য-বহির্ভূত (ব্যর্থতা) প্রস্থান স্থিতি রয়েছে। set -eপ্রভাব বাতিল করা হয়েছে যদি কমান্ড যে আয় একটি নন-জিরো প্রস্থান অবস্থা একটি হিসাবে ব্যবহার করা হয় এই শর্তে মত:

if false; then ...
while false; do ...
false && : ...
false || : ...

false && :শুধুমাত্র বাতিল set -efalse || :বাতিল করা set -eএবং প্রস্থান স্থিতি সেট করে 0তাই এটি কমান্ডের একটি ব্যর্থতার প্রস্থান কোডটিকে উপেক্ষা করতে চাই তা বলার অপেক্ষা রাখে না id বেশিরভাগ লোক যুক্তি দেখান যে || trueআরও সুগঠিত (উদ্দেশ্যটি আরও স্পষ্টভাবে জানায়)।


5
&& :উজ্জ্বল, এখানে কি কোনও ডক্স বা আরও পড়া আছে? গুগল এই ধরণের কীওয়ার্ডগুলি সন্ধান করার চেষ্টা করে আমার উপর সংক্ষেপে পড়ে…
ইয়ান বাইচেক

5

সাধারণত, ব্যাশে, কোলন :এবং trueসমতুল্য।

হয় || : আরও বুদ্ধিমান হিসাবে বিবেচিত?

আমি মনে করি এটি প্রসঙ্গে ভিত্তি করে

আপনি যদি একটি চান return value, অথবা একটি conditionসবসময় সত্য হয়, তাহলে আপনি ব্যবহার করা উচিত trueকীওয়ার্ডটি এটা আরও স্পষ্টভাবে আপনার কোড করতে এবং দর্শকদের জানি তুমি মান জোর দেওয়া চান হবে সত্য , অর্থাত্:

while true; do something

অথবা

<commnad>
RETURN_VALUE= $? || true

এবং যদি আপনি কিছুই করতে চান না , বা NOPশেলের মধ্যে, আপনার কোলন ব্যবহার করা উচিত:

if condition
then
    : # DO NOTHING HERE
else
    do something
fi 

অথবা

while conditon
do
    : # DO NOTHING HERE
done

5

এর মধ্যে বেশিরভাগ প্রতিক্রিয়া সর্বাধিক সাধারণ ব্যবহারের সমাধান করতে ব্যর্থ হয় :

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

:দুটি ব্যবহার আছে। এটি প্রতিশব্দ নয় #, তবে এটির একটি আলাদা ফাংশন রয়েছে। আপনার স্ক্রিপ্টটি ক এর অধীনে ডিবাগ করার সময় set -x, #ব্যবহৃত লাইনগুলি পার্সার দ্বারা বাদ দেওয়া হয় এবং সম্পূর্ণ উপেক্ষা করা হয়, তবে লাইনগুলি :পার্স এবং মূল্যায়ন করা হয়। ডিবাগিংয়ে এটি সত্যই কার্যকর কারণ যে -xসমস্ত লাইনের নীচে প্রদর্শিত হয় এবং মূল্যায়নের পরে তাদের মান প্রদর্শিত হয়। এটি printআপনার কোডে বিবৃতি দেওয়ার মতো যা কেবল -xমোডের নীচে প্রদর্শিত হয় । মানগুলি :আসল কোড হওয়ার পরে সতর্ক হন এবং পার্শ্ব প্রতিক্রিয়াগুলি আপনার প্রোগ্রামকে প্রভাবিত করতে পারে।


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