Is there a way to run a command (e.g. ps aux|grep someprocess
) for n times?
Something like:
run -n 10 'ps aux|grep someprocess'
I want to use it interactively.
Update: The reason I am asking this is, that I do work on a lot of machines and I don't want to import all my adaped scripts etc into every box to get the same functionality accross every machine.
I don't think a command or shell builtin for this exists, as it's a trivial subset of what the Bourne shell
for
loop is designed for and implementing a command like this yourself is therefore quite simple.Per JimB's suggestion, use the Bash builtin for generating sequences:
For very old versions of bash, you can use the
seq
command:This iterates ten times executing
command
each time - it can be a pipe or a series of commands separated by;
or&&
. You can use the$i
variable to know which iteration you're in.If you consider this one-liner a script and so for some unspecified (but perhaps valid) reason undesireable you can implement it as a command, perhaps something like this on your .bashrc (untested):
Usage:
Example:
ps aux | grep someprocess
looks like you want to watch changes of a program for a fixed time. Eduardo gave an answer that answer your question exactly but there is an alternative:watch
:Note that I've put the command in single quotes to avoid the shell from interpreting the command as "run watch ps aux" and pipe the result through
grep someprocess
. Another way to do the previous command would be:By default,
watch
refreshes every two seconds, that can be changed using the-n
option. For instance, if want to have an interval of 1 second:Just for fun
;
is a command separator and!!
replay last command in bash. So this runspgrep ssh
and then replays it 6 times.similar to previous replies, but does not require the for loop:
pipe output of seq to xargs with no arguments or options
Try this:
This requires the command to be executed in a sub-shell, a slight performance penalty. YMMV. Basically, you get the "yes" command to repeat the string "ls" N times; while "head -n5" terminated the loop at 5 repeats. The final pipe sends the command to the shell of your choice.
Incidentally
csh
-like shells have a built-inrepeat
command. You could use that to execute your command in a bash sub-shell!On macOS you can use the
repeat
command.POSIX way
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_04_01
which could of course be made into a one liner:
and seems to be the most portable way, and thus less likely to make you install programs.
The following are less portable:
{1..10}
: bash specific, and would generate a huge line if the argument is largeseq
: GNUyes
: GNUAnd if you get tired of portability, consider GNU
parallel
:which runs commands in parallel and has many cool options.
See also: https://stackoverflow.com/questions/169511/how-do-i-iterate-over-a-range-of-numbers-defined-by-variables-in-bash
A fish shell implementation of @eduardo-ivanec's
run
function aboveTo run
ps aux
multiple times searching for a different known string each time:The
grep -v " grep "
part will remove grep itself from the result, which is a bad idea if one of your search strings isgrep
.That would be 'watch' - should be part of almost every unix system using procps
You can see fs changes or otherwise interesting movement in a system. For example,
Just put your commands as an argument (see
man watch
)