Назад | Перейти на главную страницу

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

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

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

run -n 10  'ps aux|grep someprocess'

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

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

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

Для начала можно использовать манекен 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!'

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'

Просто для развлечения

pgrep ssh ;!!;!!;!!;!!;!!;!!

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

yes ls | head -n5 | bash

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

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

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

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

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

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: 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

В macOS вы можете использовать repeat команда.

repeat 10 ps aux | grep someprocess

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

function run
  set number $argv[1]
  for i in (seq $number)
    eval $argv[2..-1]
  end
end

Это было бы `` часы '' - должно быть частью почти каждой системы unix, использующей procps

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

watch "df -hP | grep /tmp" 

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