Existe uma maneira de executar um comando (por exemplo ps aux|grep someprocess
) por n vezes?
Algo como:
run -n 10 'ps aux|grep someprocess'
Eu quero usá-lo interativamente, por favor, não poste scripts.
Atualização: A razão pela qual estou perguntando isso é que trabalho em muitas máquinas e não quero importar todos os meus scripts adaptados etc. em todas as caixas para obter a mesma funcionalidade em todas as máquinas.
Respostas:
Eu não acho que exista um comando ou shell embutido para isso, pois é um subconjunto trivial para o qual o
for
loop de shell Bourne foi projetado e a implementação de um comando como esse é, portanto, bastante simples.Para iniciantes, você pode usar um
for
loop fictício :Ou de forma equivalente, de acordo com a sugestão de JimB, usando o Bash embutido para gerar sequências:
Isso itera dez vezes a execução de
command
cada vez - pode ser um canal ou uma série de comandos separados por;
ou&&
. Você pode usar a$i
variável para saber em qual iteração você está.Se você considerar este script de uma linha um script e, por algum motivo não especificado (mas talvez válido), indesejável, poderá implementá-lo como um comando, talvez algo como isto no seu .bashrc (não testado):
Uso:
Exemplo:
fonte
for
é o bash embutido para iteração.seq
:{1..10}
.bashrc
se{1..$number}
for trocada por ela`seq $number`
.ps aux | grep someprocess
parece que você deseja assistir a alterações de um programa por um tempo fixo. Eduardo deu uma resposta que responde exatamente à sua pergunta, mas existe uma alternativawatch
:Observe que eu coloquei o comando entre aspas simples para evitar que o shell interprete o comando como "run watch ps aux" e canalize o resultado
grep someprocess
. Outra maneira de executar o comando anterior seria:Por padrão,
watch
atualiza a cada dois segundos, que pode ser alterado usando a-n
opção Por exemplo, se você quiser ter um intervalo de 1 segundo:fonte
Apenas por diversão
fonte
for
parece o melhor caminho. De qualquer forma, obrigado pela resposta.cmd ;!!
em uma linha basta repetir o comando inserido antes da linha atual? Teria que ser duashistory
entradas separadas .;
por&&
para parar na primeira falha.semelhante às respostas anteriores, mas não requer o loop for:
saída de pipe de seq para xargs sem argumentos ou opções
fonte
echo "hello" 1 2 3 4 5 6 7 8 9 10
. Você precisa executar xargs com-n 1
um processo para cada entrada (número) e com-P 10
execução paralela (10 processos paralelos). Terminando comseq 10 | xargs -n 1 -P 10 echo
.Tente o seguinte:
Isso requer que o comando seja executado em um sub-shell, uma pequena penalidade de desempenho. YMMV. Basicamente, você obtém o comando "yes" para repetir a string "ls" N vezes; enquanto "head -n5" encerrou o loop em 5 repetições. O canal final envia o comando para o shell de sua escolha.
csh
Cascas semelhantes a incidentes têm umrepeat
comando interno. Você pode usar isso para executar seu comando em um sub-shell bash!fonte
Maneira POSIX
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_04_01
que naturalmente poderia ser transformado em um forro:
e parece ser a maneira mais portátil e, portanto, menos provável de fazer você instalar programas.
Os seguintes são menos portáteis:
{1..10}
: específica do bash e geraria uma linha enorme se o argumento fosse grandeseq
: GNUyes
: GNUE se você se cansar da portabilidade, considere o GNU
parallel
:que executa comandos em paralelo e tem muitas opções interessantes.
Consulte também: https://stackoverflow.com/questions/169511/how-do-i-iterate-over-a-range-of-numbers-defined-by-variables-in-bash
fonte
sh, zsh, ksh
, ebash
todos são bem suportados na maioria das plataformas.csh, tcsh, fish
tem algum apoio. Usandoparallel --embed
você pode até criar um script que possa ser facilmente movido para outro sistema que não tenha o GNU Parallel instalado.Uma implementação de shell de peixes da
run
função de @ eduardo-ivanec acimafonte
Isso seria 'watch' - deveria fazer parte de quase todos os sistemas unix usando procps
Você pode ver alterações no FS ou movimentos interessantes em um sistema. Por exemplo,
Basta colocar seus comandos como argumento (consulte
man watch
)fonte
No macOS, você pode usar o
repeat
comandofonte