相当于脚本输出自重定向的破折号

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 中工作?

mik*_*erv 6

你可以这样做:

{ 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)


che*_*ner 5

使用命名管道可以轻松模拟进程替换。

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.