¿Sintaxis de `repetir` con punto y coma en la cadena de comando?

¿Sintaxis de `repetir` con punto y coma en la cadena de comando?

Estoy atento a un proceso en FreeBSD usando un script que genera el estado actual del trabajo.

Usando el cshcomando incorporado repeat, me gustaría ejecutar el script cada 2 segundos, así que ingenuamente me gustaría hacer algo como esto:

  • repeat 100000 ./dumpstatus ; sleep 2

Obviamente, el punto y coma no funcionará según lo previsto, pero no encuentro la sintaxis correcta para incluirlo.

Puedo solucionarlo invocando una nueva instancia de Shell en repeat:

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

pero eso no es ideal y tampoco toma un camino de la corriente, pwdlo cual es molesto :)

También lo intenté repeat 10000 ( ./dumpstatus ; sleep 2)con y sin escapar de los corchetes, eso tampoco funciona y no estoy completamente seguro de por qué.

¿Cuál es la forma correcta de hacer esto, sin invocar sh -c, para que el punto y coma se interprete como me gustaría?

Respuesta1

Creo que no es posible sin invocar un Shell, como indica la página de manual de csh (en parte):

repetircomando de conteo

El comando especificado, que está sujeto a las mismas restricciones que el comando en la instrucción if de una línea anterior, se ejecuta contando veces. ...

combinado con la ifdescripción:

si (exprés)dominio

... el comando debe ser un comando simple, no un alias, una canalización, una lista de comandos o una lista de comandos entre paréntesis, pero puede tener argumentos.

... me parece que descarta otras opciones.

No puedo reproducir el error $PWD en el sh -cejemplo. Dado este script en mi directorio de inicio:

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

Y una muestra 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

... muestra script.sh ejecutándose desde $PWD del shell principal.

Respuesta2

Como repeatno se puede analizar una lista de comandos, no se puede hacer. Ojalá csh manpudiera decirlo claramente así:

 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.

Tenga en cuenta el límite de redireccionamiento único, lo que hace que el uso de una whilesolución alternativa de bucle no sea práctico. Ejemplo, que no imprime 9 vidas:

echo lives | repeat 9 cat | wc -l
1

Fuente: la cita real de man csh(pero lea repeatprimero la entrada y luego la ifentrada) es un poco indirecta:

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.

información relacionada