سؤال كيفية تشغيل الأمر عدة مرات ، وذلك باستخدام bash shell؟


هل هناك طريقة لتشغيل الأمر (على سبيل المثال؟ ps aux|grep someprocess) إلى عن على ن مرات؟

شيء مثل:

run -n 10  'ps aux|grep someprocess'

أريد استخدامه تفاعليًا ، يُرجى عدم نشر النصوص البرمجية.

تحديث: السبب في أنني أسأل هذا ، أنني أعمل على الكثير من الأجهزة ولا أريد استيراد جميع النصوص البرمجية المخططة وما إلى ذلك في كل مربع للحصول على الوظيفة نفسها عبر كل جهاز.


132
2018-05-24 15:55


الأصل


رائع أن الإجابة تحصل على الكثير من التأملات بدون سؤال حتى تلقي واحدة. دعونا نغير ذلك +1 :) - Lekensteyn
شكرًا لك على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

هذا يكرر تنفيذ عشر مرات 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



mahatmanich ، حلقة ليست نصًا. لا يوجد شيء يمنعك من استخدام ... في محطة تفاعلية. - Zoredache
حسناً ، الخط الواحد أعلاه هو نوع من الطريقة القياسية للقيام بذلك وهو بسيط إلى حد ما. لماذا هو غير جيد بالنسبة لك؟ ربما كنت تسأل السؤال الخطأ؟ ما الهدف الرئيسي من النصوص أو الإجراءات التي تريد تكرارها عدة مرات؟ ربما يكون هناك حل أفضل إذا وضعنا المشكلة بطريقة مختلفة. - Patkos Csaba
mahatmanich - for  هو باش مدمج للتكرار. - JimB
Eduardo Ivanec - لمعلوماتك ، وقد بنيت في باش مثل 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'

لاحظ أني قمت بوضع الأمر في علامات تنصيص مفردة لتجنب أن تقوم shell بتفسير الأمر على أنه "run watch ps aux" وأنبوب النتيجة خلال grep someprocess. طريقة أخرى للقيام بالأمر السابق ستكون:

watch ps aux \| grep someprocess

بشكل افتراضي، watch تحديث كل ثانيتين، يمكن تغيير ذلك باستخدام -n اختيار. على سبيل المثال ، إذا كنت ترغب في الحصول على فاصل زمني يبلغ ثانية واحدة:

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
. هو مجرد فاصل الأوامر. !! اعادة الاوامر الاخيرة في باش. حتى هذا المدى 'pgrep ssh' ثم اعادتها 6 مرات. - Piotr Kukielka
في حين أن هذا هو أمر مفيد ليست بديهية. أونيلينير for يبدو أفضل طريقة. على أي حال شكرا على الجواب. - erm3nda
متعود cmd ;!! على سطر واحد فقط كرر الأمر الذي تم إدخاله قبل الخط الحالي؟ يجب أن يكون منفصلين history الإدخالات. - Joel Purra


جرب هذا:

yes ls | head -n5 | bash

يتطلب هذا الأمر أن يتم تنفيذ الأمر في قشرة دون جزئية ، وهي عقوبة أداء بسيطة. YMMV. بشكل أساسي ، يمكنك الحصول على الأمر "نعم" لتكرار السلسلة "ls" N times؛ في حين أنهت "head -n5" الحلقة في 5 مرات متكررة. يرسل الأنبوب النهائي الأمر إلى القشرة التي تختارها.

صدفة cshعلى غرار قذائف لديها المدمج في repeat أمر. يمكنك استخدام ذلك لتنفيذ الأمر في bash sub-shell!


14
2018-01-31 00:04





مشابهة للردود السابقة ، ولكنها لا تتطلب الحلقات:

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

إخراج الأنبوب من seq إلى xargs بدون أي الحجج أو الخيارات


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: جنو

وإذا سئمت من قابلية الحمل ، ففكر في غنو 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





تنفيذ قذيفة سمكية من @ eduardo-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





من شأنه أن يكون "مراقبة" - يجب أن يكون جزءًا من كل نظام unix يستخدم procps

يمكنك رؤية تغييرات fs أو حركة مثيرة للاهتمام في نظام ما. فمثلا،

watch "df -hP | grep /tmp" 

فقط ضع الأوامر كحجة (انظر man watch)


0



هناك بالفعل إجابة مع المراقبة ... انظر أدناه ... - mahatmanich