为什么我在 rpm 脚本中收到“[...] 2> >(tee -a $logfile >&2) [...]”的语法错误,但在命令行 运行 时却没有出现语法错误以及如何得到它的工作?

Why do i get syntax error for "[...] 2> >(tee -a $logfile >&2) [...]" in a script in rpm, but not when run from commandline and how to get it work?

当 运行 as rpm preinstall scriptlet 时,为什么我在脚本中收到“[...] 2> >(tee -a $logfile >&2) [...]”的语法错误, 但不是当脚本 运行s 从命令行?

该构造的目的是始终将 stderr 转发到日志文件,但同时将 stderr 转发到日志文件和控制台。

这里是完整的示例脚本:

#!/bin/bash
LOGFILE=/tmp/example.log;

if mkdir -v /tmp/example 1>>$LOGFILE 2> >(tee -a $LOGFILE >&2);
  then
    echo "ok";
  else
    echo "ko";
    exit 1;
fi

当 运行 作为 rpm 的预脚本(使用 maven rpm 插件构建)时,我收到错误消息:

syntax error near unexpected token `>'
`         mkdir -v /tmp/example 1>>$LOGFILE 2> >(tee -a $LOGFILE >&2);'

如果我从命令行调用相同的脚本,我会如预期的那样得到 "ok"。

我需要做什么才能让它在 rpm 中运行?

感谢您提供有用的答案。

这与 rpm 无关。如果你把它放在文件脚本中,然后你尝试从命令行 运行 这个,你会得到同样的错误。 这是因为脚本执行 bash 与 posix 兼容。 参见

unset POSIXLY_CORRECT

会起作用,但您应该避免进程扩展并使用例如管道。

感谢同事,同时(在msuchy的回答之前)解决了问题如下:

[...]
mkdir -v /tmp/example 1>>$LOGFILE 2>&1|tee -a >&2;
RETURNCODE=${PIPESTATUS[0]};
if [ $RETURNCODE = 0 ];
   then
[...]