Sintaxe para `repeat` com ponto e vírgula na string de comando?

Sintaxe para `repeat` com ponto e vírgula na string de comando?

Estou de olho em um processo no FreeBSD usando um script que exibe o status atual do trabalho.

Usando o cshcomando interno repeat, gostaria de executar o script a cada 2 segundos, então, ingenuamente, gostaria de fazer algo assim:

  • repeat 100000 ./dumpstatus ; sleep 2

Obviamente, o ponto e vírgula não funcionará como esperado, mas não consigo encontrar a sintaxe correta para incluí-lo.

Posso contornar invocando uma nova instância de shell em repeat:

  • repeat 100000 sh -c 'path/to/script/dumpstatus ; sleep 2'

mas isso não é o ideal e também não segue o caminho da corrente, pwdo que é irritante :)

Também tentei repeat 10000 ( ./dumpstatus ; sleep 2)com e sem escapar dos colchetes, mas também não funcionou e não sei bem por quê.

Qual é a maneira correta de fazer isso, sem invocar sh -c, para que o ponto e vírgula seja interpretado como eu gostaria?

Responder1

Acredito que não seja possível sem invocar um shell, como afirma a página de manual do csh (em parte):

repitacomando de contagem

O comando especificado, que está sujeito às mesmas restrições que o comando na instrução if de uma linha acima, é executado contando vezes. ...

combinado com a ifdescrição:

se (expressão)comando

... o comando deve ser um comando simples, não um alias, um pipeline, uma lista de comandos ou uma lista de comandos entre parênteses, mas pode ter argumentos.

... parece-me descartar outras opções.

Não consigo reproduzir sua falha $PWD no sh -cexemplo. Dado este script em meu diretório inicial:

$ cat ~/script.sh
#!/bin/sh
echo $0 pwd is $PWD

E uma amostra de:

$ csh
$ echo $version
tcsh 6.18.01 (Astron) 2012-02-14 (x86_64-unknown-linux) options wide,nls,dl,al,kan,rh,color,filec

$ cd /tmp
$ repeat 2 sh -c '~/script.sh; sleep 2'
/home/me/script.sh pwd is /tmp
/home/me/script.sh pwd is /tmp

... mostra script.sh sendo executado a partir do $PWD do shell pai.

Responder2

Como repeatnão é possível analisar uma lista de comandos, isso não pode ser feito. Eu gostaria que isso csh manpudesse ser dito claramente assim:

 repeat count command
         The specified command must be a simple command, (not a pipeline, not a
         command list, nor a parenthesized command list), and is executed count
         times.  I/O redirections occur exactly once, even if count is 0.

Observe o limite de redirecionamento único, o que torna whileimpraticável o uso de uma solução alternativa de loop. Exemplo, que não imprime 9 vidas:

echo lives | repeat 9 cat | wc -l
1

Fonte: a citação real de man csh, (mas leia repeatprimeiro a entrada, depois a ifentrada), é um pouco indireta:

COLUMNS=90 man csh | egrep -A 7 ' (repeat|if).*and$' | sed -n '1,13{s/^ \{10\}//p}'
 if (expr) command
         If the specified expression evaluates to true, then the single
         command with arguments is executed.  Variable substitution on
         command happens early, at the same time it does for the rest of the
         if command.  command must be a simple command, not a pipeline, a
         command list, or a parenthesized command list.  Input/output redi‐
         rection occurs even if expr is false, i.e., when command is not exe‐
         cuted (this is a bug).
 repeat count command
         The specified command, which is subject to the same restrictions as
         the command in the one line if statement above, is executed count
         times.  I/O redirections occur exactly once, even if count is 0.

informação relacionada