¿Cómo puedo utilizar el registrador en un script de shell?
si corro
ntpd -qnp pool.ntp.org 2> >(logger)
En la consola, funciona como se esperaba.
Si lo pongo en un script de shell
#!/bin/sh
ntpd -qnp pool.ntp.org 2> >(logger)
Recibo el siguiente error:
line 2: syntax error: unexpected redirection
exited with code 2
¿Qué hay de malo en el script de shell?
Respuesta1
El shebang es correcto ya que se pueden usar #!/bin/sh y #!/bin/bash *; sin embargo, IIRC, debe usar tuberías que no sean redirigidas para el registrador, ya que es un programa, no un archivo.
Pruebe este script:
#!/bin/sh
ntpd -qnp pool.ntp.org 2>&1 |logger
*Si usa #!/bin/sh para sus scripts, se supone que son compatibles con Posix, es decir, funcionan bien en Solaris y AIX. Si alguna vez usa algunas funciones específicas de bash, debe usar #!/bin/bash porque ya no hay portabilidad.
Respuesta2
Lo que está mal es que estás usando bash-ismo mientras tu hash-bang dice /bin/sh
. Cámbielo a #! /bin/bash
y funcionará.
Respuesta3
De hecho, tuve que comprobar qué ntpd -qnp pool.ntp.org 2> >(logger)
hace la línea:
- Correr
ntpd -qnp pool.ntp.org
- Redirigir su stderr usando
2>
a... ¿dónde exactamente? Bien.... >(logger)
- Crea una tubería con nombre (verMecanismo), llámalo
/dev/fd/pipe100
- Inicia el proceso
logger
leyendo su STDIN desde esa tubería. - Sustituye el nombre
/dev/fd/pipe100
en el comando.
- Crea una tubería con nombre (verMecanismo), llámalo
- ...corriendo así
ntpd -qnp pool.ntp.org 2> /dev/fd/pipe100
- ...mientras el proceso
logger
lee desde esa tubería:logger < /dev/fd/pipe100
Lo anterior debería funcionar bien en bash.
Sin embargo, intenté ejecutarlo usando "sh" explícitamente, lo que produce:
script.sh: line 3: syntax error near unexpected token `>'
Entonces, como señalaron los otros comentaristas, probablemente no estés usando bash aquí.
De hecho, Busybox utiliza elConcha de Almquistpor defecto.
Respuesta4
Lo más probable es que tengas un shell diferente con /bin/sh que tu shell predeterminado (probablemente bash)
Para verificar, intente ejecutar el script con /bin/sh ./yourscript o coloque el mismo shell que $SHELL en su script
El shell que se utiliza para /bin/sh probablemente depende de la distribución y, además, si está en Solaris, es algo completamente diferente.