以下代码我放在我正在使用的许多脚本之上......
#!/bin/bash
# redirect all error messages to the protocol,
# then print the same message to stdout
exec 1> >(logger -i -s -t $0 -p 4) 2>&1
这行代码将在运行脚本时发生错误的协议条目。
但是,当通过stdin
和stdout
进行通信时,此代码无法正常工作。我只想记录错误消息。
说实话,我不知道我是如何设法让这一系列编码工作的。
尽管如此,我正在搜索代码,将exec
和logger
的组合替换为放入但是我不知道如何以这种方式捕获/接收错误消息。function
的{{1}}。
我的目标是仅创建所有错误消息的协议条目。
要明确的是,我不想在每段代码之后使用trap "createErrorMessage" ERR
而我不想用$?
抓住每一段代码。
这甚至可能吗?
答案 0 :(得分:1)
当logger
向syslog
发送输出时,systemd-cat
会为systemd
执行相同类型的功能。例如见:
echo "hello" | systemd-cat
journalctl | tail -10
如果您将脚本作为systemd服务单元运行,则无需使用systemd-cat
:默认情况下systemd
将发送它控制日志的服务的STDOUT和STDERR。
有关该工具的详情,请参阅man systemd-cat
。
答案 1 :(得分:1)
也许不明白你想要什么,但是让我们说这个脚本mytest.sh
:
date > jj
cat jj - jjj # jj + stdin + (nonexistenxt) jjj #e.g. error too
mkdir jj #error
所以,当你将它用作带有重定向的脚本时,
echo "Hello world" | bash mytest.sh > output
你会得到:
文件output
中的1。)
Thu Apr 6 21:21:13 CEST 2017
Hello world
并在屏幕上显示错误
cat: jjj: No such file or directory
mkdir: jj: File exists
现在,也改变上面的脚本
((
date > jj
cat jj - jjj # jj + stdin + (nonexistext jjj)
mkdir jj #error
) 3>&1 1>&2 2>&3 | tee >(logger -i -t $0 -p 4)) 3>&1 1>&2 2>&3
注意,从记录器args中删除了-s
。
现在再次使用它
echo "Hello world" | bash mytest.sh > output
stdout
如您所知,它有效
它可能更简单,因为使用-s
的记录器可以将消息复制到stderr本身,但这可以普遍使用。不幸的是,它使用2个以上的叉子是低效的。请注意((
。
使用:
somefunc() { some actions...; }
trap 'somefunc' ERR
不会像你期望的那样帮助你。在somefunc
中进行一些花哨的重定向为时已晚,因为错误发生后somefunc
触发了 ,例如错误消息已打印到stderr
。