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


153

क्या n समय के ps aux|grep someprocessलिए कमांड (जैसे ) चलाने का कोई तरीका है ?

कुछ इस तरह:

run -n 10  'ps aux|grep someprocess'

मैं इसे अंतःक्रियात्मक रूप से उपयोग करना चाहता हूं, कृपया स्क्रिप्ट पोस्ट न करें।

अद्यतन: मैं जो कारण पूछ रहा हूं, वह यह है कि मैं बहुत सारी मशीनों पर काम करता हूं और मैं हर मशीन के समान कार्यक्षमता प्राप्त करने के लिए अपनी सभी लिपियों आदि को हर बॉक्स में आयात नहीं करना चाहता।


जवाबों:


197

मुझे नहीं लगता कि इसके लिए एक कमांड या शेल बिलिन मौजूद है, क्योंकि यह एक तुच्छ उपसमुच्चय है जो बॉर्न शेल forलूप के लिए डिज़ाइन किया गया है और इस तरह से अपने आप को एक कमांड लागू करना इसलिए काफी सरल है।

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

3
ठीक है, ऊपर एक-लाइनर इसे करने के लिए मानक तरीका है और यह काफी सरल है। यह आपके लिए अच्छा क्यों नहीं है? शायद आप गलत सवाल पूछ रहे हैं? आपकी स्क्रिप्ट या आपके कार्यों का मुख्य लक्ष्य क्या है जो आप उन्हें कई बार दोहराना चाहते हैं? हो सकता है अगर हम समस्या को अलग तरीके से रखते हैं तो बेहतर समाधान है।
पाटकोस ससाबा

6
@ शतमानिच - बैर -इन- इट इटरेटिंग for है
जिमब


1
ऐसा लगता है कि इनबिल्ट ब्रैकेट अनुक्रम चर प्रतिस्थापन का समर्थन नहीं करता है (देखें stackoverflow.com/a/3737773/713554 )। समारोह आप दे दी है पूरी तरह से जब में रखा काम करता है .bashrc, तो {1..$number} के लिए लेन-देन हो `seq $number`यद्यपि।
सिंह

29

ps aux | grep someprocessऐसा लगता है कि आप एक निश्चित समय के लिए एक कार्यक्रम के परिवर्तन देखना चाहते हैं। एडुआर्डो ने एक ऐसा जवाब दिया जो आपके सवाल का बिल्कुल जवाब देता है लेकिन एक विकल्प है watch:

watch 'ps aux | grep someprocess'

ध्यान दें कि मैंने शेल को "रन वॉच ps ऑक्स" के रूप में व्याख्या करने से बचने के लिए सिंगल कोट्स में कमांड डाल दी है और परिणाम को पाइप करें 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

1
cmd ;!!एक लाइन पर नहीं होगा बस वर्तमान लाइन से पहले दर्ज की गई कमांड को दोहराएं ? यह दो अलग-अलग historyप्रविष्टियाँ होंगी ।
जोएल पुर्रा

पहले विफलता पर रोक के ;साथ बदलें &&
user881300

16

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

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

कोई तर्क या विकल्प के साथ seq से xargs के पाइप उत्पादन


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। मूल रूप से, आपको स्ट्रिंग "एलएस" एन बार दोहराने के लिए "हां" कमांड मिलती है; जबकि "हेड-एन 5" ने लूप को 5 रिपीट में समाप्त कर दिया। अंतिम पाइप आपकी पसंद के शेल को कमांड भेजता है।

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


5

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}: बैश स्पेसिफिक, और एक बड़ी लाइन जेनरेट करेगा यदि तर्क बड़ा है
  • 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


GNU पैरेलल को बहुत पोर्टेबल बनाया गया है। sh, zsh, ksh, और bashसभी अधिकांश प्लेटफार्मों पर अच्छी तरह से समर्थित हैं। csh, tcsh, fishकुछ समर्थन किया है। का उपयोग करते हुए parallel --embedआप भी एक स्क्रिप्ट है कि आसानी से एक और प्रणाली है जो जीएनयू समानांतर स्थापित नहीं है करने के लिए ले जाया जा सकता बना सकते हैं।
ओले तांगे

2

ऊपर @ eduardo-ivanec के 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

MacOS पर आप repeatकमांड का उपयोग कर सकते हैं ।

repeat 10 ps aux | grep someprocess
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.