Envoyer la sortie de la command à l'écran et syslog

J'essaye d'envoyer la sortie d'une command à notre syslog et c'est ce que j'ai jusqu'à présent.

#!/bin/bash log() { logger -s -t $(basename $0) "$@" } /bin/echo "test" 2>&1 | (log) 

et cela fonctionne parfaitement!

 [root@server bin]# sh /var/tmp/script.sh script.sh: test 

Cependant lorsque j'essaie d'append une string au début du message de journal, il ne fonctionne pas!

 #!/bin/bash log() { logger -s -t $(basename $0) "DEBUG: $@" } /bin/echo "test" 2>&1 | (log) 

C'est la sortie

 [root@server bin]# sh /var/tmp/script.sh script.sh: DEBUG: 

Comment puis-je décompresser la variable $ @ / $ * et append un préfixe au message de log sans perdre le stdout de la command d'origine?

C'est le comportement documenté:

message

Ecrivez ce message dans le journal; si elle n'est pas spécifiée, et que l' -f n'est pas fournie, l'input standard est consignée.

Heureusement, vous pouvez append les informations nécessaires à l'input standard de l'enregistreur:

 log() { { printf "DEBUG: $@" # Prepends the prefix. cat # Outputs the original input. } | logger -s -t $(basename $0) } 

Passer des arguments à une fonction qui peut être utilisée comme $1 ou $@ n'est pas la même chose que la lecture de stdin .

Vous devrez d'abord récupérer datatables de stdin . Ce qui suit peut ne pas être la solution idéale, mais vous donne un indice:

 #!/bin/bash log() { read INPUT logger -s -t $(basename $0) "DEBUG: $INPUT" } echo "test" | (log)