কোনটি ভাল: ব্যবহার করে; বা && এক লাইনে একাধিক কমান্ড কার্যকর করতে?


427

টিউটোরিয়ালে এবং কীভাবে আমি প্রায়শই সম্মিলিত কমান্ড দেখতে পাই। এই ক্ষেত্রে,

sudo apt-get update && sudo apt-get install pyrenamer

চারটি সম্ভাব্য সংযোগকারীগুলিকে হবে বলে মনে হচ্ছে: &, &&, ||এবং ;। যদিও & সংযোগকারী আমাকে স্পষ্ট (এটা পটভূমি একটি প্রক্রিয়া পাঠায় এবং ছেড়ে টার্মিনাল উপলব্ধ), এটা স্পষ্ট নয় কি পার্থক্য মধ্যে &&এবং ;। এবং ||কায়ার মন্তব্য হওয়া পর্যন্ত আমি জানতাম না ।

নিম্নলিখিত সংস্থাগুলি দুটি সংযোগকারীদের মধ্যে পার্থক্য নিয়ে কাজ করে তবে বেশিরভাগ মন্তব্যে তা করে:

সুতরাং এখানে সম্পর্কিত বেশ কয়েকটি প্রশ্ন রয়েছে:

  1. মধ্যে পার্থক্য কি ;এবং &&?
  2. এগুলি যথাক্রমে কখন ব্যবহার করা উচিত ? কিছু ব্যবহারের কেসগুলি দেখে ভাল লাগবে: আমি যদি কোনও কমান্ড চালাতে চাই এবং তারপরে এটি আমার কম্পিউটার বন্ধ করার পরে আমার কোন সংযোগকারীটি বেছে নেওয়া উচিত?
  3. তাদের সুবিধা এবং বিপদগুলি কী কী ? রবি বাসাক এই উত্তরের মন্তব্যে উল্লেখ করেছেন যে cd /somewhere_else; rm -Rf *কমান্ড চেইনের প্রথম উপাদানটি ব্যর্থ হলে উদাহরণস্বরূপ একটি কমান্ডের ধ্বংসাত্মক পরিণতি ঘটতে পারে।
  4. যদি প্রাসঙ্গিক হয় তবে তারা কোথা থেকে আসবে?

7
এখানে আরও একটি সংযোজক রয়েছে যা আপনি নাও আসতে পারেন: ||এটি একইভাবে &&ব্যতীত অন্যটি কেবল তখনই দ্বিতীয় আদেশটি কার্যকর করে যদি প্রথমটি শূন্য-বিহীন (ব্যর্থ) স্থিতি নিয়ে উপস্থিত হয়।
কেয়া

4
এছাড়াও নোট করুন যে আপনার স্ক্রিপ্টটি চালানো set -eব্যর্থতায় স্ক্রিপ্টটি থামিয়ে দেবে যেন সমস্ত কমান্ডের সাথে সংযুক্ত ছিল &&
চোরোবা


3
কেউ কিউএন 4 এর উত্তর দেয় না ... আমি && এবং এর আচরণের সন্দেহ করি সি প্রোগ্রামিং ভাষা দ্বারা অনুপ্রাণিত হয়েছিল। (X&&Y) এর ক্ষেত্রে, x যদি মিথ্যা হিসাবে মূল্যায়ন করে, সম্পূর্ণ এক্সপ্রেশনটি অবশ্যই মিথ্যা হবে যাতে কোনও সংকলক ব্যয়বহুল হলে ক্ষেত্রে y এর মূল্যায়ন অনুকূলিত করতে পারে। আধুনিক সি এবং সি ++ স্ট্যান্ডার্ডগুলিতে আসলে এই অপটিমাইজেশন প্রয়োজন , সুতরাং প্রোগ্রামগুলি নিরাপদে ধরে নিতে পারে যে এক্স ভুয়া থাকলে y এর মূল্যায়ন করা হবে না। উদাহরণস্বরূপ, (পিটিআর && ptr-> দিন> 31) পিটিআরটি শূন্য হলেও ক্রাশ হবে না। সি তেও, বিবৃতি দিয়ে শেষ হয়; একই লাইনে অন্য বিবৃতি আছে কিনা তা নির্বিশেষে।
কেভিন

উত্তর:


771

Cheatsheet:

A; B    # Run A and then B, regardless of success of A
A && B  # Run B if and only if A succeeded
A || B  # Run B if and only if A failed
A &     # Run A in background.

19
এবং অবশ্যই A & B &,: ব্যাকগ্রাউন্ডে এ রান করুন, তারপরে বি ব্যাকগ্রাউন্ডে চালান (সাফল্য নির্বিশেষে) এবং শেলটিতে নিয়ন্ত্রণ ফিরে করুন। এটি প্রায়শই একই সময়ে উভয় প্রক্রিয়া চালানো হিসাবে একই সম্পর্কে কাজ করে।
সীমিত প্রায়শ্চিত্ত

4
এটা কি বলা যায়: ব্যাকগ্রাউন্ডে একটি চালান, খ এর পরে ব্যাকগ্রাউন্ডে কাজ করেন তবেই? (আমি অনুমান করি &&&?)
ব্যবহারকারী 230910

14
@ ব্যবহারকারী230910: তা হবে (A && B) &
বাম দিকের বাইরে

5
আপনি কি এর জন্য প্রামাণ্য দলিল উল্লেখ করতে পারেন ?.
জাইমে হাবলুটজেল

@ জ্যাক যখন ক্রোনজব থেকে মৃত্যুদন্ড কার্যকর করা হয় তখন এটি এই নিয়মটি পুরোপুরি অনুসরণ করে না, কেন কোনও ধারণা? একটি অজগর ফাইলের জন্য
কোডগুরু

77

&&কেবলমাত্র দ্বিতীয় কমান্ডটি চালিত হয় যদি প্রথমটি স্থিতি 0 দিয়ে বের হয় (সফল হয়েছিল)। ;উভয় কমান্ড চালায়, এমনকি প্রথমটি যদি শূন্য নয় এমন স্থিতি নিয়ে বের হয়।

আপনার উদাহরণটি &&সমানভাবে প্যারাফ্রেস করা যেতে পারে

if sudo apt-get update ; then
    sudo apt-get install pyrenamer
fi

ধন্যবাদ। বিভিন্ন অনুচ্ছেদটি সহজেই পার্থক্যযোগ্য কিনা তা নিশ্চিত করতে আমি প্রশ্নটি আপডেট করেছি।
don.joey

5
@ প্রাইভেট: ;দ্বিতীয় কমান্ডটির সফল হওয়ার জন্য যদি আগের কমান্ডটির প্রয়োজন না হয় তবে আপনার ব্যবহার করা উচিত ।
চোরোবা

31

;প্রথম কমান্ড সফল কিনা তা নির্বিশেষে ব্যবহার করে কমান্ডগুলি কার্যকর করা হবে।

ব্যবহার &&2nd কমান্ড শুধুমাত্র যখন প্রথম কমান্ড সফলভাবে সম্পাদিত (অবস্থা 0) চালানো।

উভয়ই বিভিন্ন দৃষ্টিকোণে ব্যবহৃত হয়। দীর্ঘ প্রক্রিয়ার জন্য পছন্দ করুন, কোনও ইনস্টলেশনের জন্য বলুন আপনার এটি সংকলন এবং ইনস্টল করতে হবে। আপনার উচিত make && make install। সুতরাং ইনস্টলটি makeসফল হলেই চলবে ।

নির্ভরশীল কমান্ডগুলির জন্য আপনার ব্যবহার করা উচিত &&

ওয়্যারিং ব্যাশ, বা স্বতন্ত্র কমান্ড সহ কমান্ড ব্যবহার করে ;

সুতরাং আপনি যদি কম্পিউটারটি বন্ধ করতে চান এমনকি প্রথম কাজটি ব্যর্থ হয়েছে তবে প্রথম কাজের ;সম্পূর্ণ সাফল্য চাইলে শাটডাউন ব্যবহার শুরু করুন&&


14

a ; bএ এর প্রস্থান স্থিতি নির্বিশেষে খ চলবে। a && bসফল হলেই খ চালাবেন।

প্রথম 3 টি প্রশ্নের উত্তর দেওয়ার জন্য এটি প্রয়োজনীয় এবং পর্যাপ্ত। বিশেষত, 2 টি খুব বিস্তৃত এবং "একটি" নির্দিষ্ট উত্তর দেওয়া যায় না - আপনার সেরা বেট হ'ল কেস ভিত্তিতে কেস সম্পর্কে সিদ্ধান্ত নেওয়া।

চতুর্থ প্রশ্ন হিসাবে: তারা বাশ সিনট্যাক্স

এটি ব্যবহারে কোনও অভ্যন্তরীণ বিপদ নেই। আবার উপরের সংজ্ঞাটি যথেষ্ট is এটি সূচিত করে যে আপনি &&যখন লিখবেন তখন সফল না হলে bঅনিচ্ছাকৃত প্রভাব রয়েছে a। আইএমএইচও, আরও নিয়ম বা ব্যাখ্যা দেওয়ার দরকার নেই।


1

একজন; বি # রান এ এবং তারপরে বি, এ এর ​​সাফল্য নির্বিশেষে

A&&B # চালিত বি এবং যদি কেবলমাত্র A সাফল্য অর্জন করে

এ || বি # রান করুন বি এবং যদি কেবলমাত্র ব্যর্থ হয়

পটভূমিতে একটি & # রান এ।

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

উদাহরণ:

-দুটি কমান্ডের আউটপুট সংযুক্ত:

(ls foo; ls bar) > single-result.txt

ডিরেক্টরিতে গিয়ে শেলটির বর্তমান ডিরেক্টরি পরিবর্তন না করে সেখান থেকে একটি কমান্ড সম্পাদন করুন:

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