सवाल बैश खोल का उपयोग करके कई बार कमांड कैसे चलाएं?


क्या आदेश चलाने का कोई तरीका है (उदा। ps aux|grep someprocess) के लिये n बार?

कुछ इस तरह:

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 (untested) पर ऐसा कुछ:

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

उपयोग:

run 10 command

उदाहरण:

run 5 echo 'Hello World!'

170
2018-05-24 15:57



@ महतमानिक, एक लूप एक स्क्रिप्ट नहीं है। एक इंटरैक्टिव टर्मिनल पर ... के लिए उपयोग करने से आपको कुछ भी नहीं रोक रहा है। - 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'

ध्यान दें कि मैंने कमांड को "रन घड़ी ps aux" के रूप में कमांड करने से खोलने से रोकने के लिए एकल कोट्स में आदेश दिया है और परिणाम को पाइप किया है 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
; बस कमांड विभाजक है। !! बैश में अंतिम कमांड को दोहराएं। तो यह 'pgrep ssh' चलाएं और फिर इसे 6 बार फिर से चलाएं। - Piotr Kukielka
जबकि यह निर्देशक है सहज ज्ञान युक्त नहीं है। एक लाइन for सबसे अच्छा तरीका लगता है। वैसे भी जवाब के लिए धन्यवाद। - erm3nda
नहीं होगा cmd ;!! एक पंक्ति पर बस दर्ज कमांड दोहराएं से पहले वर्तमान लाइन? यह दो अलग होना होगा history प्रविष्टियों। - Joel Purra


इसे इस्तेमाल करे:

yes ls | head -n5 | bash

इसके लिए एक उप-खोल में कमांड को निष्पादित करने की आवश्यकता होती है, थोड़ा प्रदर्शन दंड। YMMV। असल में, आपको स्ट्रिंग "एलएस" एन बार दोहराने के लिए "हाँ" कमांड मिलता है; जबकि "हेड-एन 5" ने 5 दोहराने पर लूप को समाप्त कर दिया। अंतिम पाइप कमांड को आपकी पसंद के खोल में भेजता है।

संयोग से cshजैसे गोले में अंतर्निहित है repeat आदेश। आप बैश उप-खोल में अपने आदेश को निष्पादित करने के लिए इसका उपयोग कर सकते हैं!


14
2018-01-31 00:04





पिछले उत्तरों के समान, लेकिन लूप की आवश्यकता नहीं है:

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

कोई तर्क या विकल्प के साथ xqs के लिए 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


पॉज़िक्स रास्ता

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


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





वह 'घड़ी' होगा - procps का उपयोग कर लगभग हर यूनिक्स सिस्टम का हिस्सा होना चाहिए

आप एक सिस्टम में एफएस परिवर्तन या अन्यथा दिलचस्प आंदोलन देख सकते हैं। उदाहरण के लिए,

watch "df -hP | grep /tmp" 

बस अपने आदेशों को तर्क के रूप में रखें (देखें man watch)


0



घड़ी के साथ पहले से ही एक जवाब है ... नीचे देखें ... - mahatmanich