বাশ শেল ব্যবহার করে কীভাবে একাধিকবার কমান্ড চালানো যায়?


153

N বারের ps aux|grep someprocessজন্য কমান্ড চালানোর কোনও উপায় আছে (উদাহরণস্বরূপ ) ?

কিছুটা এইরকম:

run -n 10  'ps aux|grep someprocess'

আমি এটি ইন্টারেক্টিভভাবে ব্যবহার করতে চাই, দয়া করে স্ক্রিপ্টগুলি পোস্ট করবেন না।

আপডেট: আমি এটি জিজ্ঞাসা করার কারণটি হ'ল আমি প্রচুর মেশিনে কাজ করি এবং প্রতিটি মেশিনের সমান কার্যকারিতা পেতে আমি আমার সমস্ত অ্যাডাপ্ট স্ক্রিপ্টগুলি প্রতিটি বাক্সে আমদানি করতে চাই না।


উত্তর:


197

আমি মনে করি না যে এটির জন্য একটি কমান্ড বা শেল বিল্টিন রয়েছে, কারণ এটি বোর্ন শেল forলুপটি নিজের মতো একটি কমান্ড বাস্তবায়নের জন্য ডিজাইন করা এবং এটি কার্যকর করার জন্য একটি তুচ্ছ সাবসেট therefore সুতরাং এটি খুব সহজ।

প্রারম্ভিকদের জন্য আপনি একটি ডামি forলুপ ব্যবহার করতে পারেন :

for i in `seq 10`; do command; done

বা সমানভাবে জিমবির পরামর্শ অনুসারে, ক্রম তৈরির জন্য ব্যাশ বিল্টিন ব্যবহার করে:

for i in {1..10}; do command; done

এই দশ বার নির্বাহ iterates commandপ্রতিটি সময় - এটা একটি নল বা দ্বারা পৃথক কমান্ড একটি সিরিজ হতে পারে ;বা &&। আপনি $iকোন পুনরাবৃত্তিতে রয়েছেন তা জানতে আপনি ভেরিয়েবলটি ব্যবহার করতে পারেন ।

যদি আপনি এই ওয়ান-লাইনারটিকে একটি স্ক্রিপ্ট হিসাবে বিবেচনা করেন এবং তাই কিছু অনির্ধারিত (তবে সম্ভবত বৈধ) কারণে অনাকাঙ্ক্ষিত হতে পারে তবে আপনি এটি একটি আদেশ হিসাবে প্রয়োগ করতে পারেন, সম্ভবত আপনার .bashrc (অনির্ধারিত) তে এই জাতীয় কিছু:

#function run
run() {
    number=$1
    shift
    for i in `seq $number`; do
      $@
    done
}

ব্যবহার:

run 10 command

উদাহরণ:

run 5 echo 'Hello World!'

16
@ মহাটমানিচ, একটি লুপ কোনও লিপি নয়। ইন্টারেক্টিভ টার্মিনালে ... এর জন্য আপনাকে ব্যবহার করতে বাধা দেওয়ার কিছুই নেই।
জোরডাচি

3
ভাল, উপরের ওয়ান-লাইনারটি এটি করার ধরণের মান standard এবং এটি মোটামুটি সহজ। কেন এটি আপনার পক্ষে ভাল নয়? আপনি কি ভুল প্রশ্ন জিজ্ঞাসা করছেন? আপনার স্ক্রিপ্টগুলি বা আপনার ক্রিয়াকলাপগুলির মূল লক্ষ্যটি কী আপনি সেগুলি বেশ কয়েকবার পুনরাবৃত্তি করতে চান? আমরা যদি সমস্যাটিকে অন্যভাবে রাখি তবে এর থেকে আরও ভাল সমাধান হতে পারে।
প্যাটকোস সিসাবা

6
@mahatmanich - for হয় ব্যাশ বিল্ট-ইন iterating জন্য।
জিমবি

3
@ এডুয়ার্ডো ইভানেক - এফওয়াইআই, বাশ এর মধ্যে অন্তর্নির্মিত পরিসীমা রয়েছে seq: {1..10}
জিমবি

1
দেখে মনে হচ্ছে ইনবিল্ট বন্ধনী ক্রমটি পরিবর্তনশীল প্রতিস্থাপনকে সমর্থন করে না (দেখুন স্ট্যাকওভারফ্লো . com/a/3737773/713554 )। আপনি যে ফাংশনটি দিয়েছেন তা পুরোপুরি কাজ করে যখন এটির জন্য .bashrcযদি {1..$number} বিনিময় হয় `seq $number`
লিও

29

ps aux | grep someprocessদেখে মনে হচ্ছে আপনি একটি নির্দিষ্ট সময়ের জন্য কোনও প্রোগ্রামের পরিবর্তনগুলি দেখতে চান। এডুয়ার্ডো একটি উত্তর দিয়েছেন যা আপনার প্রশ্নের উত্তরটি দেবে ঠিক তবে একটি বিকল্প আছে watch:

watch 'ps aux | grep someprocess'

নোট করুন যে শেলটিকে "রান ওয়াচ পিএস অক্স" হিসাবে ব্যাখ্যা না দেওয়ার জন্য শেলটি এড়াতে আমি একক উদ্ধৃতিতে কমান্ডটি রেখেছি এবং ফলাফলটি পাইপ করব grep someprocess। পূর্ববর্তী আদেশটি করার আরেকটি উপায় হ'ল:

watch ps aux \| grep someprocess

ডিফল্টরূপে, watchপ্রতি দুই সেকেন্ডে রিফ্রেশ করে, -nবিকল্পটি ব্যবহার করে এটি পরিবর্তন করা যায় । উদাহরণস্বরূপ, যদি 1 সেকেন্ডের ব্যবধান থাকতে চান:

watch -n 1 'ps aux | grep someprocess'

21

শুধুই মজার জন্য

pgrep ssh ;!!;!!;!!;!!;!!;!!

কেউ দয়া করে এই ব্যাখ্যা করতে পারেন? খুব কৌতূহলী দেখাচ্ছে।
ড্যানিয়েল ভার্টানভ

4
; শুধু কমান্ড বিভাজক। !! বাশ এ শেষ কমান্ড পুনরায় খেলুন। সুতরাং এই 'pgrep ssh' চালান এবং তারপর এটি 6 বার পুনরায় খেলুন।
পাইওটর কুকিলকা

যদিও এটি শিক্ষণীয় বোধগম্য নয়। ওয়ান-লাইনার forসবচেয়ে ভাল উপায় বলে মনে হচ্ছে। যাইহোক উত্তরের জন্য ধন্যবাদ।
erm3nda 6

1
না cmd ;!!এক লাইনে মাত্র কমান্ড প্রবেশ পুনরাবৃত্তি আগে বর্তমান লাইন? এটি দুটি পৃথক historyএন্ট্রি হতে হবে ।
জোয়েল পুররা

প্রথম ব্যর্থতা থামাতে ;সঙ্গে প্রতিস্থাপন &&
ব্যবহারকারী 881300

16

পূর্ববর্তী জবাবগুলির মতো, তবে লুপের প্রয়োজন নেই:

seq 10 | xargs -I -- echo "hello"

কোন আর্গুমেন্ট বা বিকল্প ছাড়া sear এর পাইপ আউটপুট


2
এটি কেবল একটি মৃত্যুদন্ড কার্যকর করবে echo "hello" 1 2 3 4 5 6 7 8 9 10-n 1প্রতিটি ইনপুট (সংখ্যা) এবং -P 10সমান্তরাল সম্পাদন (10 সমান্তরাল প্রক্রিয়া) সহ একটি প্রক্রিয়া সহ আপনার xargs চালানো দরকার । সাথে শেষ seq 10 | xargs -n 1 -P 10 echo
আলেকজান্ডার ক্লিমেটসেক

16

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

yes ls | head -n5 | bash

এটির জন্য একটি সাব-শেলতে কমান্ডটি কার্যকর করা দরকার, সামান্য পারফরম্যান্স পেনাল্টি। YMMV। মূলত, আপনি "হ্যাঁ" কমান্ডটি "ls" এন বার পুনরাবৃত্তি করতে পারেন; "হেড-এন 5" 5 টি পুনরাবৃত্তিতে লুপটি সমাপ্ত করে। চূড়ান্ত পাইপটি আপনার পছন্দের শেলটিতে আদেশ পাঠায়।

ঘটনাচক্রে- cshমত শেলগুলির একটি বিল্ট-ইন repeatকমান্ড থাকে। ব্যাশ সাব-শেলটিতে আপনার কমান্ডটি কার্যকর করতে আপনি এটি ব্যবহার করতে পারেন!


5

পসিক্স ওয়ে

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_04_01

x=10
while [ $x -gt 0 ]; do
    command
    x=$(($x-1))
done

যা অবশ্যই একটি লাইনারে তৈরি করা যেতে পারে:

x=10; while [ $x -gt 0 ]; do command; x=$(($x-1)); done

এবং এটি সর্বাধিক বহনযোগ্য উপায় বলে মনে হচ্ছে এবং সুতরাং আপনাকে প্রোগ্রাম ইনস্টল করার সম্ভাবনা কম।

নিম্নলিখিতগুলি কম পোর্টেবল:

  • ব্রেস প্রসারণ {1..10}: বাশ নির্দিষ্ট, এবং যুক্তি বড় হলে একটি বিশাল লাইন উত্পন্ন করবে
  • seq: জিএনইউ
  • yes: জিএনইউ

এবং আপনি যদি বহনযোগ্যতায় ক্লান্ত হয়ে পড়ে তবে জিএনইউ বিবেচনা করুন parallel:

sudo apt-get install parallel
seq 100 | parallel echo {}

যা সমান্তরালভাবে কমান্ড চালায় এবং অনেক দুর্দান্ত বিকল্প রয়েছে।

আরও দেখুন: https://stackoverflow.com/questions/169511/how-do-i-iterate-over-a-range-of-numbers-defined-by-variables-in-bash


GNU সমান্তরাল খুব বহনযোগ্য হিসাবে নির্মিত হয়। sh, zsh, ksh, এবং bashসমস্ত বেশিরভাগ প্ল্যাটফর্মগুলিতে ভালভাবে সমর্থিত। csh, tcsh, fishকিছু সমর্থন আছে। parallel --embedআপনি ব্যবহার করে এমন কোনও স্ক্রিপ্ট তৈরি করতে পারেন যা সহজেই অন্য সিস্টেমে সরানো যেতে পারে যা GNU সমান্তরাল ইনস্টলড নেই।
ওলে টাঞ্জ

2

উপরে @ এডুয়ার্ডো-আইভানেকের runক্রিয়াকলাপের একটি ফিশ শেল বাস্তবায়ন

function run
  set number $argv[1]
  for i in (seq $number)
    eval $argv[2..-1]
  end
end

0

এটি 'ওয়াচ' হবে - প্রোপস ব্যবহার করে প্রায় প্রতিটি ইউনিক্স সিস্টেমের অংশ হওয়া উচিত

আপনি কোনও সিস্টেমে fs পরিবর্তনগুলি বা অন্যথায় আকর্ষণীয় চলাচল করতে পারেন। উদাহরণ স্বরূপ,

watch "df -hP | grep /tmp" 

আপনার আদেশগুলি কেবল আর্গুমেন্ট হিসাবে রাখুন (দেখুন man watch)


ঘড়ির সাথে ইতিমধ্যে একটি উত্তর রয়েছে ... ঠিক নীচে দেখুন ...
মহাতমানিচ

0

ম্যাকোজে আপনি repeatকমান্ডটি ব্যবহার করতে পারেন ।

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