Estoy atento a un proceso en FreeBSD usando un script que genera el estado actual del trabajo.
Usando el csh
comando 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, pwd
lo 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 if
descripció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 -c
ejemplo. 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 repeat
no se puede analizar una lista de comandos, no se puede hacer. Ojalá csh man
pudiera 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 while
solució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 repeat
primero la entrada y luego la if
entrada) 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.