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


একটি কমান্ড চালানোর জন্য একটি উপায় আছে (যেমন। ps aux|grep someprocess) জন্য এন বার?

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

run -n 10  'ps aux|grep someprocess'

আমি এটি interactively ব্যবহার করতে চান, স্ক্রিপ্ট পোস্ট করবেন না দয়া করে।

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


132
2018-05-24 15:55


উত্স


প্রশ্নের উত্তর ছাড়াও এমন উত্তর অনেকগুলি উত্তর পাওয়ার বিস্ময়কর। এর যে +1 পরিবর্তন করুন :) - Lekensteyn
@ লেকেনস্টেন ধন্যবাদ - mahatmanich
stackoverflow.com/questions/3737740/... - Ciro Santilli 新疆改造中心 六四事件 法轮功


উত্তর:


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

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

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

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

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

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

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

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

ব্যবহার:

run 10 command

উদাহরণ:

run 5 echo 'Hello World!'

171
2018-05-24 15:57



@ মাহাতম্যানিক, এ লুপ একটি স্ক্রিপ্ট নয়। কোনও ইন্টারেক্টিভ টার্মিনালে ব্যবহার করার জন্য আপনাকে বাধা দেয় না। - Zoredache
আচ্ছা, উপরের এক লাইনার এটি করার জন্য আদর্শ পদ্ধতির ধরন এবং এটি মোটামুটি সহজ। কেন এটা আপনার জন্য ভাল না? হয়তো আপনি ভুল প্রশ্ন জিজ্ঞাসা করছেন? আপনার স্ক্রিপ্টগুলির প্রধান উদ্দেশ্য বা আপনার ক্রিয়াগুলি কি আপনি কতবার তাদের পুনরাবৃত্তি করতে চান? আমরা যদি ভিন্নভাবে সমস্যাটি স্থাপন করি তবে হয়তো একটি ভাল সমাধান রয়েছে। - Patkos Csaba
@ মাহাতম্যানিক - for  হয় পুনরাবৃত্তি জন্য নির্মিত bash। - JimB
@Eduardo Ivanec - FYI, bash এর মতো অন্তর্নির্মিত পরিসীমা রয়েছে seq: {1..10} - JimB
মনে হচ্ছে ইনব্লিট বন্ধনী ক্রমিক পরিবর্তনশীল প্রতিস্থাপন সমর্থন করে না (দেখুন stackoverflow.com/a/3737773/713554)। আপনি দেওয়া ফাংশন যখন পুরোপুরি কাজ করে .bashrc যদি {1..$number} জন্য বিনিময় করা হয় `seq $number` যদিও। - Leo


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'

29
2018-05-26 15:07



হ্যাঁ এই একটি কবজ মত কাজ করে। - Jānis Gruzis


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

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

21
2018-06-27 13:04



কেউ এই দয়া করে ব্যাখ্যা করতে পারেন? খুব চিত্তাকর্ষক দেখায়। - Daniel Vartanov
; শুধু কমান্ড বিভাজক হয়। !! bash মধ্যে শেষ কমান্ড replay। সুতরাং এই রান 'pgrep ssh' এবং তারপর 6 বার এটি পুনরায় চালানো। - Piotr Kukielka
যে নির্দেশমূলক তাত্পর্যপূর্ণ হয় না। এক রৈখিক for সবচেয়ে ভাল উপায় মনে হয়। যাইহোক উত্তর জন্য ধন্যবাদ। - erm3nda
না করবে না cmd ;!! এক লাইন শুধু প্রবেশ কমান্ড পুনরাবৃত্তি আগে বর্তমান লাইন? এটা দুই পৃথক হতে হবে history এন্ট্রি। - Joel Purra


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

yes ls | head -n5 | bash

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

প্রসঙ্গক্রমে cshশেল মত একটি অন্তর্নির্মিত আছে repeat কমান্ড। আপনি একটি bash উপ-শেল মধ্যে আপনার কমান্ড চালানোর জন্য যে ব্যবহার করতে পারে!


14
2018-01-31 00:04





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

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

কোন আর্গুমেন্ট বা অপশন সঙ্গে xargs seq পাইপ আউটপুট


11
2017-11-18 14:36



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


POSIX উপায়

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}: নির্দিষ্ট bash, এবং যুক্তি বড় হলে একটি বিশাল লাইন উৎপন্ন করবে
  • seq: জিএনইউ
  • yes: জিএনইউ

এবং আপনি পোর্টেবিলিটি ক্লান্ত পেতে, GNU বিবেচনা করুন 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


4
2018-06-15 09:39





@ এডুয়ার্ডো-ivanec এর একটি মাছ শেল বাস্তবায়ন run ক্রিয়া উপরে

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

2
2018-06-20 18:44





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

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

watch "df -hP | grep /tmp" 

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


0



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