![Use o logger no shell script](https://rvso.com/image/623627/Use%20o%20logger%20no%20shell%20script.png)
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/bash
e funcionará.
Responder3
Na verdade, eu tive que verificar o que a linha ntpd -qnp pool.ntp.org 2> >(logger)
faz:
- Correr
ntpd -qnp pool.ntp.org
- Redirecione seu stderr usando
2>
para ... onde exatamente? Bem.... >(logger)
- Cria um pipe nomeado (vejaMecanismo), chame-o
/dev/fd/pipe100
- Inicia o processo
logger
lendo seu STDIN daquele pipe - Substitui o nome
/dev/fd/pipe100
no comando
- Cria um pipe nomeado (vejaMecanismo), chame-o
- ... assim correndo
ntpd -qnp pool.ntp.org 2> /dev/fd/pipe100
- ...enquanto o processo
logger
lê 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.