שאלה כיצד להפעיל פקודה מספר פעמים, באמצעות פגז bash?


האם יש דרך להפעיל פקודה (למשל ps aux|grep someprocess) ל n פעמים?

משהו כמו:

run -n 10  'ps aux|grep someprocess'

אני רוצה להשתמש בו באופן אינטראקטיבי, בבקשה לא לכתוב סקריפטים.

עדכון: הסיבה שאני שואל את זה היא, כי אני עושה עבודה על הרבה מכונות ואני לא רוצה לייבא את כל סקריפטים מעוצב וכו 'לתוך כל תיבה כדי לקבל את אותה פונקציונליות מעבר לכל מכונה.


132
2018-05-24 15:55




נהדר כי התשובה לקבל upvotes רבים כל כך מבלי לשאול את השאלה אפילו אחד. בוא נשנה את זה +1 :) - Lekensteyn
תודה Llekensteyn - mahatmanich
stackoverflow.com/questions/3737740/... - Ciro Santilli 新疆改造中心 六四事件 法轮功


תשובות:


אני לא חושב פקודה או פגז שנבנה עבור זה קיים, שכן זה טריוויאלי משנה של מה פגז Bourne for לולאה מיועדת ויישום פקודה כמו זה בעצמך ולכן די פשוט.

בתור התחלה אתה יכול להשתמש ב דמה for לולאה:

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

או באופן שווה לפי ההצעה של JimB, באמצעות הבנים Bash להפקת רצפים:

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  J את הבאש מובנה עבור איטרטינג. - JimB
@Eduardo Ivanec - לידיעתך, באש יש מובנה טווח כמו seqYou {1..10} - JimB
נראה כי רצף סוגר inbuilt אינו תומך החלפת משתנה (ראה stackoverflow.com/a/3737773/713554). הפונקציה שהענקת פועלת באופן מושלם כאשר היא ממוקמת .bashrc אם {1..$number} הוא החליף `seq $number` אם כי. - Leo


ps aux | grep someprocess נראה כאילו אתה רוצה לראות שינויים של תוכנית עבור זמן קבוע. אדוארדו נתן תשובה כי לענות על השאלה שלך בדיוק אבל יש חלופה: watchYou

watch 'ps aux | grep someprocess'

שים לב כי שמתי את הפקודה במרכאות יחיד כדי למנוע את הקליפה מ לפרש את הפקודה כמו "הפעל watch 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
; הוא רק מפריד פקודה. !! הפעל את הפקודה האחרונה ב - bash. אז זה לרוץ 'pshrep ssh' ולאחר מכן שידור חוזר 6 פעמים. - Piotr Kukielka
אמנם זה מאלפת הוא לא אינטואיטיבי אינטליגנטי. אניה אחת for נראה הדרך הטובה ביותר. בכל מקרה תודה על התשובה. - erm3nda
לא cmd ;!! על שורה אחת פשוט לחזור על הפקודה נכנס לפני את השורה הנוכחית? זה צריך להיות שני נפרדים history רשומות. - Joel Purra


נסה את זה:

yes ls | head -n5 | bash

זה דורש את הפקודה להיות מבוצע בתוך תת קליפה, עונש ביצועים קלים. YMMV. בעיקרון, אתה מקבל את הפקודה "כן" לחזור על מחרוזת "ls" N פעמים; בעוד "head -n5" סיים את הלולאה ב 5 חוזר. הצינור הסופי שולח את הפקודה לקליפה על פי בחירתך.

אגב cshכמו פגזים יש מובנית repeat פקודה. אתה יכול להשתמש בו כדי לבצע את הפקודה שלך באש תת פגז!


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: גנו

ואם אתה עייף ניידות, לשקול GNU parallelYou

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