Utilice el registrador en el script de shell

Utilice el registrador en el script de shell

¿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/bashy funcionará.

Respuesta3

De hecho, tuve que comprobar qué ntpd -qnp pool.ntp.org 2> >(logger)hace la línea:

  1. Correrntpd -qnp pool.ntp.org
  2. Redirigir su stderr usando 2>a... ¿dónde exactamente? Bien....
  3. >(logger)
    1. Crea una tubería con nombre (verMecanismo), llámalo/dev/fd/pipe100
    2. Inicia el proceso loggerleyendo su STDIN desde esa tubería.
    3. Sustituye el nombre /dev/fd/pipe100en el comando.
  4. ...corriendo asíntpd -qnp pool.ntp.org 2> /dev/fd/pipe100
  5. ...mientras el proceso loggerlee 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.

información relacionada