Как запустить команду несколько раз, используя оболочку bash?

Есть ли способ выполнить команду (например, ps aux | grep someprocess ) для n раз?

Что-то вроде:

  run -n 10 'ps aux | grep someprocess'
 

Я хочу использовать его в интерактивном режиме, не отправляйте скрипты.

Обновление. Причина, по которой я прошу об этом, заключается в том, что я работаю на многих машинах, и я не хочу импортировать все адаптированные скрипты и т. д. в каждую коробку, чтобы получить одну и ту же функциональность на каждой машине.

121 голос | спросил mahatmanich 24 Maypm11 2011, 19:55:11

8 ответов


159

Я не думаю, что для этого существует команда или оболочка, поскольку это тривиальное подмножество того, что цикл Bourne shell для предназначен для реализации и такой команды, как это, поэтому очень просто .

Для начала вы можете использовать фиктивный для цикл:

  для i в `seq 10`; выполнить команду; сделанный
 

Или эквивалентно по предложению JimB, используя встроенный Bash для генерации последовательностей:

  для i в {1..10}; выполнить команду; сделанный
 

Это повторяется в десятикратном выполнении команды каждый раз - это может быть канал или последовательность команд, разделенных символом ; или & amp; & amp; . Вы можете использовать переменную $ i , чтобы знать, в какую итерацию вы находитесь.

Если вы считаете этот однострочный скрипт сценарием, и поэтому для некоторой неуказанной (но, возможно, допустимой) причины нежелательной вы можете реализовать ее как команду, возможно, что-то подобное на вашем .bashrc (untested):

  #function run
бег() {
    число = $ 1
    сдвиг
    для i в `seq $ number`; делать
      $ @
    сделанный
}
 

Использование:

команда
  run 10
 

Пример:

  запустить 5 echo 'Hello World!'
 
ответил Eduardo Ivanec 24 Maypm11 2011, 19:57:39
29

ps aux | grep someprocess выглядит так, будто вы хотите следить за изменениями программы в течение фиксированного времени. Эдуардо дал ответ, который точно отвечает на ваш вопрос, но есть альтернатива: watch :

  смотреть 'ps aux | grep someprocess '
 

Обратите внимание, что я поместил команду в одинарные кавычки, чтобы избежать интерпретации команды командой «запустить watch ps aux» и передать результат через grep someprocess . Другой способ выполнить предыдущую команду:

  смотреть ps aux \ | grep someprocess
 

По умолчанию watch обновляется каждые две секунды, которые можно изменить с помощью параметра -n . Например, если хотите иметь интервал в 1 секунду:

  watch -n 1 'ps aux | grep someprocess '
 
ответил Lekensteyn 26 Maypm11 2011, 19:07:17
21

Просто для удовольствия

  pgrep ssh; !!; !!; !!; !!; !!; !!
 
ответил hdaz 27 J0000006Europe/Moscow 2012, 17:04:12
14

Попробуйте следующее:

  yes ls | head -n5 | удар
 

Для этого требуется, чтобы команда выполнялась в подчиненной оболочке с небольшим штрафом за производительность. YMMV. В принципе, вы получаете команду «да», чтобы повторить строку «ls» N раз; в то время как «head -n5» завершает цикл с 5 повторами. Последний канал отправляет команду в оболочку по вашему выбору.

Кстати, csh -like shells имеет встроенную команду repeat . Вы можете использовать это, чтобы выполнить свою команду в подчиненной bash!

ответил android42 31 Jam1000000amThu, 31 Jan 2013 04:04:00 +040013 2013, 04:04:00
10

похож на предыдущие ответы, но не требует цикла for:

  seq 10 | xargs -I - эхо "привет"
 

вывод канала от seq до xargs без аргументов или опций

ответил nils-holmberg 18 32015vEurope/Moscow11bEurope/MoscowWed, 18 Nov 2015 17:36:17 +0300 2015, 17:36:17
4

POSIX

http://pubs.opengroup.org/onlinepubs/9699919799 /utilities/V3_chap02.html#tag_18_06_04_01

  х = 10
while [$ x -gt 0]; делать
    команда
    х = $ (($ х-1))
сделанный
 

, который, конечно, можно было бы превратить в один лайнер:

  х = 10; while [$ x -gt 0]; выполнить команду; х = $ (($ х-1)); сделанный
 

и, по-видимому, является самым переносимым способом и, следовательно, менее вероятно, что вы устанавливаете программы.

Ниже приведены менее портативные:

  • расширение скобки {1..10} : bash specific, и будет генерировать огромную строку, если аргумент большой
  • seq : GNU
  • yes : GNU

И если вы устали от переносимости, рассмотрите GNU parallel :

  sudo apt-get install parallel
seq 100 | параллельное эхо {}
 

, который запускает команды параллельно и имеет много интересных опций.

См. также: ответил Ciro Santilli 新疆改造中心 六四事件 法轮功 15 J0000006Europe/Moscow 2015, 12:39:53

2

Реализация оболочки рыбы из функции запуска @ eduardo-ivanec выше

  функция run
  set number $ argv [1]
  для i in (seq $ number)
    eval $ argv [2 ..- 1]
  конец
конец
 
ответил Ciro Santilli 新疆改造中心 六四事件 法轮功 15 J0000006Europe/Moscow 2015, 12:39:53
0

Это будет «смотреть» - должно быть частью почти каждой системы unix, используя procps

Вы можете видеть изменения fs или иначе интересные движения в системе. Например,

  смотреть "df -hP | grep /tmp"
 

Просто поместите свои команды в качестве аргумента (см. man watch )

ответил Chris Arnu 20 J0000006Europe/Moscow 2018, 21:44:52

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132