在 Bash 中你可以重定向所有未来标准输出的输出当前正在运行脚本。例如使用这个脚本,
exec > >(logger -t my-awesome-script)
echo 1
echo 2
echo 3
这将最终出现在系统日志中:
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
但这是 Bash 特有的,带有重定向的裸执行器似乎在 Dash 中不起作用。
Syntax error: redirection unexpected
我怎样才能让它在 Dash 中工作,或者在两个 shell 中工作?
答案1
你可以这样做:
{ commands
....
} | logger -t my_awesome_script
您可以使用任何 shell 来完成此操作。
如果您不喜欢它的外观,也许可以将脚本包装在函数中。
#!/bin/sh
run() if [ "$run" != "$$" ] || return
then sh -c 'run=$$ exec "$0" "$@"' "$0" "$@" |
logger -t my-awesome-script
fi
#script-body
run "$@" || do stuff
答案2
使用命名管道可以轻松模拟进程替换。
mkfifo logger_input
logger -t my_awesome_script < logger_input &
exec > logger_input
echo 1
echo 2
echo 3
事实上,命名管道是/dev/fd
可以在 .NET 中实现进程替换的机制之一(另一个是 )bash
。