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

1

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

Usando o comando csh builtin repeat , eu 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 pretendido, mas não consigo encontrar a sintaxe correta para incluí-lo.

Eu posso contornar invocando uma nova instância de shell sob repeat :

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

mas isso dificilmente é ideal, e não pega um caminho do atual pwd que é irritante:)

Eu também tentei repeat 10000 ( ./dumpstatus ; sleep 2) com e sem escapar dos colchetes, isso também não funciona e não estou completamente certo do porquê.

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

    
por Stilez 27.11.2017 / 08:52

2 respostas

2

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

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. ...

combinado com a descriçã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-me descartar outras opções.

Não consigo reproduzir sua falha de $ PWD no exemplo sh -c . Dado este script no meu diretório pessoal:

$ 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 o script.sh sendo executado a partir do $ PWD do shell pai.

    
por 28.11.2017 / 14:49
0

Como repeat não pode analisar uma lista de comandos, isso não pode ser feito. Eu gostaria que csh man pudesse dizer 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, que torna impraticável o uso de uma solução alternativa de loop while . Exemplo, que não imprime 9 vidas:

echo lives | repeat 9 cat | wc -l
1

Origem : a cotação real de man csh , (mas leia a entrada em repeat primeiro e, em seguida, a entrada if ), é uma pequena rotatória:

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.
    
por 28.11.2017 / 14:49