Ale*_*x B 9 io-redirection dash shell-script process-substitution
在 Bash 中,您可以重定向当前正在运行的脚本的所有未来stdout 输出。例如使用这个脚本,
exec > >(logger -t my-awesome-script)
echo 1
echo 2
echo 3
Run Code Online (Sandbox Code Playgroud)
这将在系统日志中结束:
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
Run Code Online (Sandbox Code Playgroud)
但这是 Bash 特定的,带有重定向的裸 exec 在 Dash 中似乎不起作用。
Syntax error: redirection unexpected
Run Code Online (Sandbox Code Playgroud)
我怎样才能让它在 Dash 中工作,或者可能在两个 shell 中工作?
你可以这样做:
{ commands
....
} | logger -t my_awesome_script
Run Code Online (Sandbox Code Playgroud)
你可以用任何外壳来做到这一点。
如果您不喜欢它的外观,可以让脚本将自身包装在一个函数中。
#!/bin/sh
run() if [ "$run" != "$$" ] || return
then sh -c 'run=$$ exec "$0" "$@"' "$0" "$@" |
logger -t my-awesome-script
fi
#script-body
run "$@" || do stuff
Run Code Online (Sandbox Code Playgroud)
使用命名管道可以轻松模拟进程替换。
mkfifo logger_input
logger -t my_awesome_script < logger_input &
exec > logger_input
echo 1
echo 2
echo 3
Run Code Online (Sandbox Code Playgroud)
事实上,命名管道是/dev/fd可以在bash.
| 归档时间: |
|
| 查看次数: |
3303 次 |
| 最近记录: |