Есть ли способ запустить команду (например, 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
: GNUyes
: 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
)