为什么我会收到" [...] 2>的语法错误>(tee -a $ logfile>& 2)[...]"在rpm中的脚本中,但不是从命令行运行时如何让它工作?

时间:2016-02-12 15:11:58

标签: rpm scriptlet

为什么我会收到" [...] 2>的语法错误>(tee -a $ logfile>& 2)[...]"在作为rpm预安装scriptlet运行时的脚本中,但是当脚本从命令行运行时不是吗?

该构造的目的是将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&#34 ;.

我需要做些什么才能让它在rpm内工作?

感谢您提供有用的答案。

2 个答案:

答案 0 :(得分:2)

这与rpm无关。如果您将其放在文件脚本中并尝试从命令行运行它,您将得到相同的错误。 这是因为脚本执行bash与posix兼容。 见https://stackoverflow.com/a/12122609/3489429

unset POSIXLY_CORRECT

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

答案 1 :(得分:0)

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

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