Traço equivalente ao redirecionamento automático da saída do script

9

No Bash você pode redirecionar toda a saída stdout future do script atualmente em execução . Por exemplo, com este script,

exec > >(logger -t my-awesome-script)
echo 1
echo 2
echo 3

Isso terminará no syslog:

Oct 26 01:03:16 mybox my-awesome-script[72754]: 1
Oct 26 01:03:16 mybox my-awesome-script[72754]: 2
Oct 26 01:03:16 mybox my-awesome-script[72754]: 3

Mas isso é específico para Bash e o exec nu com redirecionamento parece não funcionar em Dash.

Syntax error: redirection unexpected

Como posso fazer isso funcionar no Dash, ou possivelmente nos dois shells?

    
por Alex B 25.10.2014 / 15:46

3 respostas

6

Você pode apenas fazer:

{ commands
....
} | logger -t my_awesome_script

Você pode fazer isso com qualquer shell.

Se você não gostar da aparência, talvez faça o script se envolver em uma função.

#!/bin/sh
run() if     [ "$run" != "$$" ] || return
      then   sh -c 'run=$$ exec "$0" "$@"' "$0" "$@" |
             logger -t my-awesome-script
      fi
#script-body
run "$@" || do stuff
    
por 25.10.2014 / 16:15
4

A substituição do processo é facilmente simulada com pipes nomeados.

mkfifo logger_input
logger -t my_awesome_script < logger_input &
exec > logger_input
echo 1
echo 2
echo 3

Na verdade, pipes nomeados são um dos mecanismos (o outro sendo /dev/fd ) com os quais a substituição do processo pode ser implementada em bash .

    
por 26.10.2014 / 16:36
2

Eu não acho que isso seja possível em dash . Tanto quanto eu posso dizer de seu man page , ele não tem suporte para substituição de processo.

Como solução alternativa, você pode tentar o mikserv sugerido ou redirecionar tudo para um arquivo, e então, depois que seu script terminar (presumivelmente, isso está em um script), adicione o conteúdo desse arquivo ao registrador:

$ exec > ~/foo/foo.txt
$ ls
$ echo something
$ cat foo/foo.txt | sudo logger -t my-awesome-script
    
por 25.10.2014 / 16:21