为什么我在 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
[...]
当 运行 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
[...]