Repete um comando do terminal

1

Suponha que eu tenha um comando de terminal chamado foo (na realidade isso seria algo como cd ou ls ou algo mais complicado. Existe uma maneira de executar este comando várias vezes SEM o uso de um roteiro.

Por exemplo, quero fazer o equivalente ao seguinte:

foo && foo && foo && foo && foo

Existe alguma maneira de fazer algo nos moldes de

foo * 5 

ou talvez

5:foo

Estou usando uma máquina linux.

    
por Nosrettap 06.12.2013 / 20:06

5 respostas

1

Adicione alguma semi-comma na resposta do blogger para torná-lo uma só linha:

for variables in {1 2 3 4 5};  do ls; done
    
por 06.12.2013 / 20:30
1

o blogger está certo. no entanto, é importante observar a sintaxe exatamente: se você estiver usando um shell interativo (por exemplo, o terminal)

echo -n; for i in {1..5}; do if [[ $? ]]; then foo; fi; done

o "$?" retorna o status da chamada de função anterior; porque estamos chamando "echo" primeiro, a primeira iteração do loop será "true" (0 no bash). O "fi" fecha a instrução "if", e os ponto-e-vírgulas são necessários.

aqui é a mesma coisa se você estivesse escrevendo um script bash:

#!/bin/bash
echo -n
for i in {1..5}; do
if [[ $? ]]; then
foo
fi
done

você notará que o foo não tem um ponto e vírgula depois dele; ao escrever um script bash completo em um ambiente onde as quebras de linha estão disponíveis (por exemplo, seu editor de texto favorito), as quebras de linha fazem a mesma coisa que os pontos-e-vírgulas:)

também, note que você poderia usar

[[ $? ]] && foo

em vez da instrução if; perceber que o & & significa que foo só será executado se o foo anterior não tiver um erro. isto é, na chamada de função

thing1 && thing2

thing2 só será executado se o thing1 rodar bem (tecnicamente, se ele retornar um valor 0) para ignorar se foo está funcionando ou não, use ponto-e-vírgula em vez de & &

    
por 06.12.2013 / 20:35
1

Você pode tentar algo como:

for i in {1..10}; do YourCommand; done

Exemplo:

for i in {1..5}; do ls -l; done

    
por 06.12.2013 / 21:04
0

Você já tentou usar o loop "for"?

for VARIABLE in 1 2 3 4 5 .. N
do
    command1
    command2
    commandN
done
    
por 06.12.2013 / 20:14
0

Encontrei um ótimo método aqui .

Eu sei que ainda é "um tipo de script", mas acho que é o mais próximo que você pode conseguir sem digitar uma linha de comando inteira com comandos.

Você pode criar o comando repeat com o qual você pode fazer isso:

 repeat 5 ./foo

Adicione as seguintes linhas ao final do seu ~/.bashrc (se você estiver usando o bash):

repeat() {
    n=$1
    shift
    while [ $(( n -= 1 )) -ge 0 ]
    do
        "$@"
    done
}

e na próxima vez que você fizer login (ou iniciar o bash), você poderá usar repeat 5 ./foo .

Entre. repeat já é uma palavra-chave (que faz exatamente o mesmo) em csh, tcsh e zsh, portanto, com essa adição, você a adicionará a bash e funcionará exatamente da mesma maneira.

    
por 06.12.2013 / 22:05