¿Hay alguna forma de ejecutar un comando (por ejemplo ps aux|grep someprocess
) n veces?
Algo como:
run -n 10 'ps aux|grep someprocess'
Quiero usarlo de forma interactiva, no publique scripts.
Actualización: La razón por la que pregunto esto es porque trabajo en muchas máquinas y no quiero importar todos mis scripts adaptados, etc. en cada cuadro para obtener la misma funcionalidad en cada máquina.
Respuestas:
No creo que exista un comando o shell incorporado para esto, ya que es un subconjunto trivial de para qué
for
está diseñado el bucle de shell Bourne y, por lo tanto, implementar un comando como este es bastante simple.Para empezar, puede usar un
for
bucle ficticio :O, de manera equivalente, según la sugerencia de JimB, utilizando el Bash incorporado para generar secuencias:
Esto se repite diez veces ejecutándose
command
cada vez: puede ser una tubería o una serie de comandos separados por;
o&&
. Puedes usar la$i
variable para saber en qué iteración estás.Si considera que este one-liner es un script y, por alguna razón no especificada (pero quizás válida) indeseable, puede implementarlo como un comando, tal vez algo como esto en su .bashrc (no probado):
Uso:
Ejemplo:
fuente
for
es el bash integrado para iterar.seq
:{1..10}
.bashrc
si{1..$number}
se intercambia`seq $number`
.ps aux | grep someprocess
Parece que desea ver los cambios de un programa durante un tiempo fijo. Eduardo dio una respuesta que responde a su pregunta exactamente pero hay una alternativawatch
:Tenga en cuenta que he puesto el comando entre comillas simples para evitar que el shell interprete el comando como "ejecutar watch ps aux" y canalizar el resultado
grep someprocess
. Otra forma de hacer el comando anterior sería:Por defecto, se
watch
actualiza cada dos segundos, eso se puede cambiar usando la-n
opción. Por ejemplo, si desea tener un intervalo de 1 segundo:fuente
Solo por diversión
fuente
for
parece la mejor manera. De todos modos, gracias por la respuesta.cmd ;!!
se repetirá en una línea el comando introducido antes de la línea actual? Tendrían que ser doshistory
entradas separadas .;
con&&
para detenerse en la primera falla.similar a las respuestas anteriores, pero no requiere el ciclo for:
salida de tubería de seq a xargs sin argumentos u opciones
fuente
echo "hello" 1 2 3 4 5 6 7 8 9 10
. Debe ejecutar xargs con-n 1
un proceso para cada entrada (número) y con-P 10
ejecución paralela (10 procesos paralelos). Terminando conseq 10 | xargs -n 1 -P 10 echo
.Prueba esto:
Esto requiere que el comando se ejecute en un sub-shell, una leve penalización de rendimiento. YMMV. Básicamente, obtienes el comando "yes" para repetir la cadena "ls" N veces; mientras que "head -n5" finalizó el ciclo en 5 repeticiones. La tubería final envía el comando al shell de su elección.
Por cierto, los
csh
proyectiles tienen unrepeat
comando incorporado . ¡Podrías usar eso para ejecutar tu comando en un bash shell!fuente
Manera POSIX
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_04_01
que por supuesto podría convertirse en una línea:
y parece ser la forma más portátil y, por lo tanto, es menos probable que haga que instale programas.
Los siguientes son menos portátiles:
{1..10}
llaves: bash específico, y generaría una línea enorme si el argumento es grandeseq
: GNUyes
: GNUY si te cansas de la portabilidad, considera GNU
parallel
:que ejecuta comandos en paralelo y tiene muchas opciones interesantes.
Ver también: https://stackoverflow.com/questions/169511/how-do-i-iterate-over-a-range-of-numbers-defined-by-variables-in-bash
fuente
sh, zsh, ksh
, ybash
todos están bien soportados en la mayoría de las plataformas.csh, tcsh, fish
Tiene algo de apoyo. Alparallel --embed
usarlo, incluso puede crear un script que se pueda mover fácilmente a otro sistema que no tenga GNU Parallel instalado.Una implementación de concha de pescado de la
run
función de @ eduardo-ivanec anteriorfuente
Eso sería 'ver', debería ser parte de casi todos los sistemas Unix que usan procps
Puede ver cambios fs o movimientos interesantes en un sistema. Por ejemplo,
Simplemente ponga sus comandos como argumento (ver
man watch
)fuente
En macOS puedes usar el
repeat
comando.fuente