'tcsh' repetir com subshell

0

Estou tentando descobrir como repetir um comando complexo dentro de uma repetição em tcsh , assim

repeat 9999 (curl http://localhost:80/index.php; echo)

Estou usando um subshell aqui em vez de { e } porque, de acordo com o link , o tcsh não tem esse recurso.

No entanto, recebo o seguinte erro inesperado da construção anterior.

Badly placed ()'s

Então, como você repete um comando complexo com tcsh ?

Existem algumas reclamações antigas sobre inconsistências estranhas de csh e, por extensão, tcsh , por ex. esse link . Então não sei o que pensar desse erro.

    
por Gregory Nisbet 13.04.2016 / 22:46

4 respostas

1

De tcsh(1) :

repeat count command
    The  specified  command,  which is subject to the same restric‐
    tions as the command in the one line  if  statement  above,  is
    executed  count  times. [..]

E da documentação if :

if (expr) command
    [..]
    command must  be  a  simple  command,  not  an alias,  a  pipeline,  a
    command list or a parenthesized command list, but it  may  have
    arguments. [..]

Parece que isso não é algo que você possa fazer.

Para contornar isso, você pode usar um simples script de wrapper.

    
por 13.04.2016 / 23:09
1

Outra alternativa seria usar o ZSH.

% repeat 3 (echo hi; echo there)
hi
there
hi
there
hi
there
% 
    
por 13.04.2016 / 23:09
0

Como repeat é um comando interno, mas não faz parte da sintaxe, você não pode usar () s na lista de argumentos facilmente.

Mesmo com o Bourne Shell que é menos limitado que tcsh

repeat -c 3 (echo a)

não funcionará.

O que funciona é:

(repeat -c 10 echo a)

como isso executa o comando inteiro em um subshell. Mas mesmo:

(repeat -c 3 echo a; echo b)

repetirá o echo a três vezes, mas só chamará echo b uma vez.

No entanto:

repeat -c 3 "echo a"

é recomendado caso você queira repetir mais de um comando simples com repeat builtin. Isso funciona mesmo para comandos menos simples porque repeat se comporta de forma semelhante a eval .

    
por 14.04.2016 / 13:49
0

Acho que você pode usar "eval" para isso, por exemplo:

repeat 7 eval "cmd1;cmd2"
    
por 25.04.2017 / 17:15