Use logger no shell script

2

Como posso usar o registrador em um script de shell?

Se eu correr

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

no console, funciona como esperado.

Se eu colocá-lo 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?

    
por user1091344 28.12.2013 / 11:27

4 respostas

6

O shebang está correto, pois #! / bin / sh e #! / bin / bash podem ser usados *, no entanto, IIRC, você deve usar pipes não redirecionados para 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 devem ser compatíveis com posix, ou seja, executar bem em solaris e AIX. Se alguma vez você usar alguns recursos específicos do bash, #! / Bin / bash devem ser usados porque não há mais portabilidade.

    
por 28.12.2013 / 11:56
2

O que está errado é que você está usando o bash-ism enquanto seu hash-bang está dizendo /bin/sh . Altere-o para #! /bin/bash e ele funcionará.

    
por 28.12.2013 / 11:35
2

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

  1. Executar ntpd -qnp pool.ntp.org
  2. Redireciona seu stderr usando 2> para ... onde exatamente? Bem ....
  3. %código%
    1. Cria um pipe nomeado (consulte Mechanism ), chame-o de >(logger)
    2. Inicia o processo /dev/fd/pipe100 lendo seu STDIN a partir desse canal
    3. Substitui o nome logger no comando
  4. ... executando, assim, /dev/fd/pipe100
  5. ... enquanto o processo ntpd -qnp pool.ntp.org 2> /dev/fd/pipe100 lê esse canal: logger

O acima deve funcionar bem no bash.

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

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

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

De fato, o Busybox usa o Almquist Shell por padrão.

    
por 28.12.2013 / 17:35
0

O mais provável é que você tenha um shell diferente com / bin / sh do que o seu shell padrão (provavelmente o bash)

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

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

    
por 28.12.2013 / 15:36