Dash 相当于脚本输出的自重定向

Dash 相当于脚本输出的自重定向

在 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

答案3

我认为这在dash.据我所知man,它不支持进程替换。

作为解决方法,您可以尝试什么米克塞尔建议,或者您可以将所有内容重定向到一个文件,然后在脚本完成后(大概是在脚本中),将该文件的内容添加到记录器:

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

相关内容