Use o logger no shell script

Use o logger no shell script

Como posso usar o logger em um script de shell?

Se eu correr

ntpd -qnp pool.ntp.org 2> >(logger)

no console, funciona conforme o esperado.

Se eu colocar em um script de shell

#!/bin/sh
ntpd -qnp pool.ntp.org 2> >(logger)

Recebo o seguinte erro:

line 2: syntax error: unexpected redirection
exited with code 2

O que há de errado no script de shell?

Responder1

O Shebang está correto, pois #!/bin/sh e #!/bin/bash podem ser usados ​​*, no entanto, IIRC, você deve usar pipes e não redirecionar para o logger, pois é um programa e não um arquivo.

Experimente este script:


#!/bin/sh
ntpd -qnp pool.ntp.org 2>&1 |logger

*Se você usar #!/bin/sh para seus scripts, eles deverão ser compatíveis com posix, ou seja, funcionar bem em Solaris e AIX. Se alguma vez você usar alguns recursos específicos do bash, #!/bin/bash deverá ser usado porque não há mais portabilidade.

Responder2

O que há de errado é que você está usando bash-ismo enquanto seu hash-bang está dizendo /bin/sh. Mude para #! /bin/bashe funcionará.

Responder3

Na verdade, eu tive que verificar o que a linha ntpd -qnp pool.ntp.org 2> >(logger)faz:

  1. Correrntpd -qnp pool.ntp.org
  2. Redirecione seu stderr usando 2>para ... onde exatamente? Bem....
  3. >(logger)
    1. Cria um pipe nomeado (vejaMecanismo), chame-o/dev/fd/pipe100
    2. Inicia o processo loggerlendo seu STDIN daquele pipe
    3. Substitui o nome /dev/fd/pipe100no comando
  4. ... assim correndontpd -qnp pool.ntp.org 2> /dev/fd/pipe100
  5. ...enquanto o processo loggerlê esse pipe:logger < /dev/fd/pipe100

O acima deve funcionar bem no bash.

No entanto, tentei executá-lo usando "sh" explicitamente, o que resultou:

script.sh: line 3: syntax error near unexpected token `>'

Então, como observaram os outros comentaristas, você provavelmente não está usando o bash aqui.

Na verdade, o Busybox usa oConcha Alquistapor padrão.

Responder4

Provavelmente você tem um shell diferente com /bin/sh do seu shell padrão (provavelmente bash)

Para verificar, tente executar o script com /bin/sh ./yourscript ou coloque o mesmo shell que $SHELL em seu script

Qual shell é usado para /bin/sh provavelmente depende da distribuição e, se você estiver no Solaris, é algo completamente diferente.

informação relacionada