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


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

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

run -n 10  'ps aux|grep someprocess'

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

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


123
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

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

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!'

159
2018-05-24 15:57



@mahatmanich, цикл не сценарий. Ничто не мешает вам использовать ... на интерактивном терминале. - Zoredache
Ну, однострочный выше - это стандартный способ сделать это, и это довольно просто. Почему это не хорошо для вас? Может быть, вы задаете неправильный вопрос? Какова основная цель ваших сценариев или ваших действий, которые вы хотите повторять несколько раз? Может быть, есть лучшее решение, если мы поставим проблему по-другому. - Patkos Csaba
@mahatmanich - for  является встроенный bash для итерации. - JimB
@Eduardo Ivanec - FYI, у bash есть встроенный диапазон, например 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'

Обратите внимание, что я поместил команду в одинарные кавычки, чтобы избежать интерпретации командной строки командой «run watch 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
; это просто разделитель команд. !! повторите последнюю команду в bash. Итак, запустите «pgrep ssh», а затем воспроизведите его 6 раз. - Piotr Kukielka
Хотя это поучительно не интуитивно понятно. Один лайнер for кажется лучшим способом. В любом случае спасибо за ответ. - erm3nda
не будет cmd ;!! на одной строке просто повторите введенную команду до текущая строка? Это должно быть два отдельных history записей. - Joel Purra


Попробуй это:

yes ls | head -n5 | bash

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

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


14
2018-01-31 00:04





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

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

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


10
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 specific, и будет генерировать огромную линию, если аргумент большой
  • seq: GNU
  • yes: GNU

И если вы устали от переносимости, рассмотрите 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


4
2018-06-15 09:39





Реализация рыбной оболочки @ eduardo-ivanec's 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