শেল কমান্ডে "&&" এর উদ্দেশ্য কী?


354

আমি যতদূর জানি, &কমান্ডটি ব্যবহার করার পরে এটি ব্যাকগ্রাউন্ডে চালানো হয়।

&ব্যবহারের উদাহরণ :tar -czf file.tar.gz dirname &

তবে কীভাবে &&? (এই উদাহরণটি দেখুন: /server/215179/centos-100-disk-full-how-to-remove-log-files-history-etc#answer-215188 )

উত্তর:


397

&&পূর্ববর্তী কমান্ডটি সফলভাবে সম্পন্ন হয়েছে কিনা তার উপর ভিত্তি করে আপনাকে কিছু করতে দেয় - এজন্য আপনি এটিকে শৃঙ্খলাবদ্ধ দেখতে দেখেন do_something && do_something_else_that_depended_on_something


391

তদ্ব্যতীত, আপনার কাছে ||যা যৌক্তিক বা, এবং ;যা কেবল একটি বিভাজক যা পূর্বে কমান্ডের সাথে কী ঘটবে তা পরোয়া করে না।

$ false || echo "Oops, fail"
Oops, fail

$ true || echo "Will not be printed"
$  

$ true && echo "Things went well"
Things went well

$ false && echo "Will not be printed"
$

$ false ; echo "This will always run"
This will always run

এ সম্পর্কিত কিছু বিবরণ পাওয়া যাবে বাশ ম্যানুয়ালটিতে কমান্ডের তালিকা


5
আপনি যোগ করতে চান false && echo "Will not be printed"
এমটিএসান

112

কমান্ড-লাইন - এর উদ্দেশ্য কী &&?

শেল ইন, আপনি যখন দেখতে পাবেন

$ command one && command two

উদ্দেশ্যটি নিম্নলিখিত কমান্ডটি কার্যকর করা হয় && হবে যা প্রথম কমান্ডটি সফল হলে কেবল । এটি পসিক্স শেলগুলির ইডিয়োমেটিক এবং এটি কেবল বাশে পাওয়া যায় না।

এটি প্রথম ব্যর্থ হলে দ্বিতীয় প্রক্রিয়া চালানো রোধ করতে মনস্থ করে।

আপনি লক্ষ্য করতে পারেন আমি "উদ্দেশ্য" শব্দটি ব্যবহার করেছি - এটি সঙ্গত কারণেই। সমস্ত প্রোগ্রামের একই আচরণ হয় না, সুতরাং এটি কাজ করার জন্য, আপনাকে বুঝতে হবে যে প্রোগ্রামটি "ব্যর্থতা" হিসাবে বিবেচনা করে এবং ডকুমেন্টেশন পড়ে এটি কীভাবে পরিচালনা করে এবং যদি প্রয়োজন হয়, উত্স কোডটিও।

আপনার শেলটি সত্যের জন্য 0, এবং মিথ্যাটির জন্য অন্যান্য ধনাত্মক সংখ্যার ফেরতের মান বিবেচনা করে

প্রোগ্রামগুলি প্রস্থান করার সিগন্যাল ফিরিয়ে দেয় । যদি তারা সফলভাবে প্রস্থান করে তবে তাদের 0 ফেরত আসা উচিত, বা না থাকলে শূন্যের চেয়ে বড়। এটি প্রক্রিয়াগুলির মধ্যে সীমিত পরিমাণে যোগাযোগের অনুমতি দেয়।

&&হিসাবে উল্লেখ করা হয় AND_IFposix শেল ব্যাকরণ , যা একটি অংশ and_orতালিকা কম্যান্ডের, যা অন্তর্ভুক্ত ||একটি যাOR_IF অনুরূপ শব্দার্থবিদ্যা সঙ্গে।

ডকুমেন্টেশন থেকে উদ্ধৃত ব্যাকরণ প্রতীক:

%token  AND_IF    OR_IF    DSEMI
/*      '&&'      '||'     ';;'    */

এবং ব্যাকরণ (ডকুমেন্টেশন থেকে উদ্ধৃতও), যা দেখায় যে যে কোনও সংখ্যক AND_IF( &&) এবং / অথবা OR_IFগুলি ( ||) সংযুক্ত করা যেতে পারে (যেমন and_orপুনরাবৃত্তভাবে সংজ্ঞায়িত করা হয়):

and_or           :                         pipeline
                 | and_or AND_IF linebreak pipeline
                 | and_or OR_IF  linebreak pipeline

উভয় অপারেটরের সমান প্রাধান্য রয়েছে এবং বাম থেকে ডানে মূল্যায়ন করা হয় (তারা বাম সংঘবদ্ধ)। যেমন ডকস বলেছেন:

একটি AND-ORতালিকা এক বা একাধিক পাইপলাইনগুলি অপারেটার দ্বারা পৃথক একটি ক্রম "&&"এবং "||"

একটি তালিকা এক বা একাধিক একটি ক্রম এবং-বা তালিকা অপারেটার দ্বারা পৃথক ';'এবং '&'এবং ঐচ্ছিকরূপে দ্বারা সমাপ্ত ';', '&'অথবা।

অপারেটরগুলির "&&"এবং "||"সমান প্রাধান্য পাবে এবং বাম সাহসিকতার সাথে মূল্যায়ন করা হবে। উদাহরণস্বরূপ, নিম্নলিখিত দুটি কমান্ডই কেবলমাত্র স্ট্যান্ডার্ড আউটপুটটিতে বার লিখবে:

$ false && echo foo || echo bar
$ true || echo foo && echo bar
  1. প্রথম ক্ষেত্রে, মিথ্যা হ'ল একটি আদেশ যা স্থিতি সহ প্রস্থান করে 1

    $ false
    $ echo $?
    1

    যার অর্থ echo fooচলবে না (অর্থাত্‍ শর্টকার্কুইটিং echo foo)। তারপর কমান্ড echo barকার্যকর করা হয়।

  2. দ্বিতীয় ক্ষেত্রে, সত্যের একটি কোড সহ প্রস্থান করে 0

    $ true
    $ echo $?
    0

    এবং তাই echo fooমৃত্যুদন্ড কার্যকর করা হয় না, তারপরে echo barমৃত্যুদন্ড কার্যকর করা হয়।


31

'অ্যান্ড অ্যান্ড' এর জন্য বেশ সাধারণ ব্যবহার অটোটুলগুলি সহ সফ্টওয়্যার সংকলন করছে। উদাহরণ স্বরূপ:

./configure --prefix=/usr && make && sudo make install

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

কখনও কখনও আমি সত্যিই বহন করা হয় ...

tar xf package.tar.gz && ( cd package; ./configure && make && sudo make install ) && rm package -rf

উদাহরণস্বরূপ স্ক্র্যাচ বক্স থেকে একটি লিনাক্স তৈরি করার সময় আমি এটি করি।


2
REPL মধ্যে ভাল, কিন্তু স্ক্রিপ্ট আমি পছন্দ করেন set -o errexitব্যাশ জন্য।
ফ্রাঙ্কলিন ইউ

19

&&স্ট্রিং একসাথে কমান্ড। পূর্ববর্তী কমান্ডগুলি সফল হলে কেবল কার্যকর আদেশগুলি কার্যকর করা হয়।

একইভাবে, || পূর্ববর্তী ব্যর্থ হলে ধারাবাহিক কমান্ড কার্যকর করতে অনুমতি দেয়।

দেখুন ব্যাশ শেল প্রোগ্রামিং


8

উদাহরণ দেখুন:

mkdir test && echo "Something" > test/file

শেল ডিরেক্টরি তৈরি করার চেষ্টা করবে testএবং তারপরে, কেবলমাত্র এটি সাফল্যপূর্ণ ছিল তার ভিতরে ফাইল তৈরি করার চেষ্টা করবে।

সুতরাং যদি সেগুলির মধ্যে একটি ব্যর্থ হয় তবে আপনি পদক্ষেপগুলির ক্রমটি বাধাগ্রস্ত করতে পারেন।


8

প্রথম বিবৃতিটি সফলভাবে শেষ হলে এটি দ্বিতীয় বিবৃতি কার্যকর করতে হবে। একটি বিবৃতি মত:

 if (1 == 1 && 2 == 2)
  echo "test;"

এটির প্রথম চেষ্টা করে যদি 1 == 1, যদি এটি সত্য হয় তবে এটি পরীক্ষা করে যদি 2 == 2 হয়


1
কেউ কি ব্যাখ্যা করতে পারে যে এই প্রশ্নটির কারণে হোঁচট খাচ্ছে ব্যবহারকারীদের জন্য কেন এটিকে নিম্নমানের করা হয়েছিল?
ব্যবহারকারী3243242

1
@ user3243242 এটা ব্যবহার চিত্রিত করা ভুল, শুধু একটি দরিদ্র উদাহরণ&&
Dan

ifপরীক্ষাগুলি কীভাবে কাজ করে তা এটির অন্তর্দৃষ্টি । আমি কখনই এটিকে তুলনা কমান্ডগুলির শৃঙ্খলার মতো ভাবি নি, যখন তাদের কোনওটি ব্যর্থ হয় breaking সুতরাং আপনি আমার
উপন্যাসটি

1
ফলাফলটি হ'ল ||আপনি চ্যানেল কমান্ডগুলি ব্যবহার করে বিপরীত আচরণটি পেতে পারেন যতক্ষণ না eei || leu || uie || echo prout3 || echo "never executed"
সেগুলির একটি

7

command_1 && command_2: কেবলমাত্র কমান্ড_2 কার্যকর করুন যখন কমান্ড_1 সফলভাবে কার্যকর করা হবে।

command_1 || command_2: কেবলমাত্র কমান্ড_2 কার্যকর করুন যখন কমান্ড_1 সফলভাবে কার্যকর হয় না।

কিভাবে একটি 'যদি' অবস্থা, মত একটি মূলধারার প্রোগ্রামিং ভাষায় কার্যকর হিসাবে অনুরূপ অনুভূত হয়, এ if (condition_1 && condition_2){...}condition_2 যদি condition_1 হয় বাদ দেওয়া হবে falseএবং if (condition_1 || condition_2){...}condition_2 যদি condition_1 হয় বাদ দেওয়া হবে true। দেখুন, কোডিংয়ের জন্য আপনি একই কৌশলটি ব্যবহার করেন :)


আপনি ঠিক 'বিপরীত' দ্বারা কী বোঝাতে চেয়েছেন তা জানি না, তবে $ প্রতিধ্বনি '1' || প্রতিধ্বনি '2' কেবল '1' মুদ্রণ করে। এবং $ ভুল_কমন্ডল || প্রতিধ্বনি '2' পরের লাইনে একটি ত্রুটি বার্তা এবং '2' প্রিন্ট করে। আপনি এটি সম্পর্কে ভুল বলে মনে করেন সে সম্পর্কে আপনি আরও কিছুটা ব্যাখ্যা করতে পারেন?
জিয়াওনিন লি

ওহে বন্ধু, আমি গতকাল অবশ্যই খুব ক্লান্ত ছিলাম। এর জন্য দুঃখিত, এটি কেবলমাত্র আমিই ছিল: / আপনি চাইলে আমি উত্তর দেওয়ার জন্য আপনাকে কিছু উত্তর করতে হবে (যদি আপনার উত্তর 0 দিতে হয়, এখনই
স্ট্যাকওভারফ্লোটি

@ সচেতন, চিন্তা করবেন না ঠিক আছে। সুতরাং আমি সবেমাত্র একটি সম্পাদনা জমা দিয়েছি। সুতরাং আপনি এখন ডাউন ভোট সরাতে সক্ষম?
জিয়াওনিন লি

হ্যাঁ, আবার, দুঃখিত, সত্যই
উত্সাহিত

0
####################### && or (Logical AND) ######################
first_command="1"
two_command="2"

if [[ ($first_command == 1) && ($two_command == 2)]];then
 echo "Equal"
fi

প্রোগ্রামটি যদি কমান্ডটি পরীক্ষা করে থাকে, তবে প্রোগ্রামটি একটি সংখ্যা তৈরি করে বলে প্রস্থান কোড বলে, যদি উভয় শর্ত সত্য হয়, প্রস্থান কোডটি শূন্য (0) হয়, অন্যথায়, প্রস্থান কোডটি ইতিবাচক সংখ্যা। কেবলমাত্র প্রস্থান কোডটি শূন্য (0) উত্পাদিত হলে সমান প্রদর্শন করার সময় উভয় শর্ত সত্য true


স্ট্যাকওভারফ্লোতে স্বাগতম। আপনার কোড স্নিপেট এখানে পোস্ট করার আগে কাজ করে তা নিশ্চিত করুন। আপনাকে এটি সংশোধন করতে হবেif [[ ($first_command == "1") && ($two_command == "2") ]];then echo "Equal"; fi
ঝেং কো

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