শেলের এক লাইনে একাধিক কমান্ড চালানো


388

বলুন আমার কাছে একটি ফাইল আছে /templates/appleএবং আমি চাই

  1. এটি দুটি আলাদা জায়গায় রেখে দিন
  2. আসল অপসারণ।

সুতরাং, এবং এ /templates/appleঅনুলিপি করা হবে এবং তারপরে আমি আসলটি সরাতে চাই।/templates/used/templates/inuse

এটি cpকরার সর্বোত্তম উপায়টি কি অনুসরণ করবে rm? নাকি এর চেয়ে ভাল উপায় আছে?

আমি এগুলি সমস্ত এক লাইনেই করতে চাই তাই আমি ভাবছি এটি এর মতো দেখতে লাগবে:

cp /templates/apple /templates/used | cp /templates/apple /templates/inuse | rm /templates/apple

এটি কি সঠিক বাক্য গঠন?

উত্তর:


792

আপনি |কমান্ডের আউটপুটকে অন্য কমান্ডের দিকে নির্দেশ করতে (পাইপ) ব্যবহার করছেন । আপনি যা সন্ধান করছেন তা হ'ল &&পূর্ববর্তী কমান্ড কেবলমাত্র পরবর্তী কমান্ডটি কার্যকর করতে হবে:

cp /templates/apple /templates/used && cp /templates/apple /templates/inuse && rm /templates/apple

অথবা

cp /templates/apple /templates/used && mv /templates/apple /templates/inuse

বাশের কমান্ড অপারেটর / বিভাজককে সংক্ষিপ্ত করতে (নিঃসন্দেহে):

  • |পাইপ (পাইপলাইন) stdoutঅন্য একটির স্ট্যান্ডার্ড ইনপুটটিতে একটি কমান্ডের স্ট্যান্ডার্ড আউটপুট ( )। নোট করুন যে stderrএখনও যা ঘটুক না কেন তার ডিফল্ট গন্তব্যে চলে যায়।
  • |&উভয় stdoutএবং stderrএকটি কমান্ডের পাইপ অন্য একের স্ট্যান্ডার্ড ইনপুটটিতে। খুব দরকারী, বাশ সংস্করণ 4 এবং তদূর্ধ্বে উপলব্ধ।
  • &&&&পূর্ববর্তীটি সফল হলে কেবল ডান হাতের কমান্ড কার্যকর করে ।
  • ||||এটির ডান-হাত কমান্ডটি কার্যকর করে শুধুমাত্র এটি পূর্ববর্তী ব্যর্থ হয়েছিল।
  • ;;পূর্ববর্তী কমান্ডটি সফল হয়েছে বা ব্যর্থ হয়েছে তা নির্বিশেষে সর্বদা ডানহাতি কমান্ড কার্যকর করে । যদি না set -eপূর্বে প্রার্থনা ছিল, যা ঘটায় bashএকটি ত্রুটি উপর ব্যর্থ।

6
সম্মত। অফিসিয়াল ডকুমেন্টেশন gnu.org/software/bash/manual/bash.html# তালিকা
ফ্লো

78

cpঅবস্থান 1 কেন না , তাহলেmv অবস্থান 2 এ This এটি মূলটি "অপসারণ" এর যত্ন নেয়।

এবং না, এটি সঠিক বাক্য গঠন নয়। |একটি প্রোগ্রাম থেকে আউটপুট "পাইপ" করতে এবং পরবর্তী প্রোগ্রামের জন্য এটি ইনপুটতে পরিণত করতে ব্যবহৃত হয়। আপনি ;যা চান তা হ'ল যা একাধিক কমান্ড পৃথক করে।

cp file1 file2 ; cp file1 file3 ; rm file1

যদি আপনার প্রয়োজন হয় যে পৃথক কমান্ডগুলি পরবর্তী শুরু করার আগে সফল হওয়া উচিত, তবে আপনি &&পরিবর্তে এটি ব্যবহার করতে পারেন :

cp file1 file2 && cp file1 file3 && rm file1

এইভাবে, যদি কোনও cpকমান্ড ব্যর্থ হয়, তবে rmচালানো হবে না।


10

নোট যে cp A B; rm Aঠিক mv A B। এটি আরও দ্রুত হবে, যেহেতু আপনাকে আসলে বাইটগুলি অনুলিপি করতে হবে না (ধরে নেওয়া গন্তব্যটি একই ফাইল সিস্টেমে রয়েছে), কেবল ফাইলটির নাম পরিবর্তন করুন। তাহলে তুমি চাওcp A B; mv A C


7

আরেকটি বিকল্প Ctrl+V Ctrl+Jপ্রতিটি কমান্ডের শেষে টাইপ করা হয়।

উদাহরণ (প্রতিস্থাপন #সঙ্গে Ctrl+V Ctrl+J):

$ echo 1#
echo 2#
echo 3

আউটপুট:

1
2
3

পূর্ববর্তীগুলি ব্যর্থ হলে তা কমান্ডগুলি কার্যকর করবে।

একই রকম: echo 1; echo 2; echo 3

আপনি যদি ব্যর্থ কমান্ডগুলিতে মৃত্যুদন্ড কার্যকর করতে চান, &&সর্বশেষটি ব্যতীত প্রতিটি লাইনের শেষে যুক্ত করুন ।

উদাহরণ (প্রতিস্থাপন #সঙ্গে Ctrl+V Ctrl+J):

$ echo 1 &&#
failed-command &&#
echo 2

আউটপুট:

1
failed-command: command not found

ইন zshআপনার কাছে ব্যবহার করতে পারেন Alt+Enterবা Esc+Enterপরিবর্তেCtrl+V Ctrl+J


3

এটা চেষ্টা কর..

cp /templates/apple /templates/used && cp /templates/apple /templates/inuse && rm /templates/apple


2

পাইপ ব্যবহার করা আমার কাছে অদ্ভুত বলে মনে হয়। যাইহোক আপনার লজিক্যাল andব্যাশ অপারেটরটি ব্যবহার করা উচিত :

$ cp /templates/apple /templates/used && cp /templates/apple /templates/inuse && rm /templates/apples

তাহলে cpকমান্ড ব্যর্থ rmনির্বাহ করা হবে না।

অথবা, আপনি একটি forলুপ এবং ব্যবহার করে আরও বিস্তৃত কমান্ড লাইন তৈরি করতে পারেন cmp

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