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.
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.
Eu não acho que exista um comando ou shell embutido para isso, pois é um subconjunto trivial do que o
for
loop do shell Bourne foi projetado e implementar um comando como esse por conta própria é, portanto, bastante simples.Por sugestão de JimB, use o Bash embutido para gerar sequências:
Para versões muito antigas do bash, você pode usar o
seq
comando:Isso itera dez vezes executando
command
cada vez - pode ser um pipe 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ê considera este one-liner um script e por algum motivo não especificado (mas talvez válido) indesejável, você pode implementá-lo como um comando, talvez algo assim em seu .bashrc (não testado):
Uso:
Exemplo:
ps aux | grep someprocess
parece que você quer assistir as alterações de um programa por um tempo fixo. Eduardo deu uma resposta que responde exatamente a sua pergunta, mas existe uma alternativa:watch
:Observe que coloquei o comando entre aspas simples para evitar que o shell interprete o comando como "run watch ps aux" e canalize o resultado por meio de arquivos
grep someprocess
. Outra maneira de fazer 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 quiser ter um intervalo de 1 segundo:Apenas por diversão
;
é um separador de comandos e!!
repete o último comando no bash. Então isso é executadopgrep ssh
e, em seguida, reproduz 6 vezes.semelhante às respostas anteriores, mas não requer o loop for:
saída de pipe de seq para xargs sem argumentos ou opções
Tente isto:
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" terminou o loop em 5 repetições. O pipe final envia o comando para o shell de sua escolha.
Aliás
csh
, shells semelhantes a shells têm umrepeat
comando embutido. Você pode usar isso para executar seu comando em um sub-shell bash!No macOS, você pode usar o
repeat
comando.maneira POSIX
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_04_01
que, claro, poderia ser feito 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ífico 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 legais.
Veja também: https://stackoverflow.com/questions/169511/how-do-i-iterate-over-a-range-of-numbers-defined-by-variables-in-bash
run
Uma implementação de concha de peixe da função de @eduardo-ivanec acimaPara executar
ps aux
várias vezes procurando uma string conhecida diferente a cada vez:A
grep -v " grep "
parte removerá o próprio grep do resultado, o que é uma má ideia se uma de suas strings de pesquisa forgrep
.Isso seria 'watch' - deve fazer parte de quase todos os sistemas unix usando procps
Você pode ver mudanças de fs ou movimentos interessantes em um sistema. Por exemplo,
Basta colocar seus comandos como um argumento (veja
man watch
)