命令输出重定向仅适用于控制台,而不适用于脚本

时间:2016-05-11 16:14:31

标签: bash

我想在bash中捕获命令输出到变量,但也将它显示给控制台。

exec 5>&1
STATUS=$(zypper info rar|tee >(cat - >&5))
echo $STATUS

它以控制台预期的方式工作。在以下简单脚本中调用时,它可以很好地运行。

#!/bin/bash
exec 5>&1
STATUS=$(zypper info rar|tee >(cat - >&5))
echo $STATUS

但是在以下脚本中调用时,会产生错误。

#!/bin/sh
#
# description: currency_trader_tools installation script
# Currency_Trader software.
#
# prerequisities:
#   OpenSuse Leap 42.1 x86_64
#            clean installation of Minimal Server Selection (Text mode)
# install:
#       Midnight Commander - linux file manager
#       x11vnc  -   X11 vnc server
#       xvfb-run    -   X11 virtual frame buffer server
#       java - latest JDK environment rpm
#
# commit_id =               "0f46a17011ca82c57ddb7f81636984c7bebd5798";
# build_revision_full =     "Build 0144 created 2016-05-11 18:04:00 based on commit 0f46a17011ca82c57ddb7f81636984c7bebd5798";
# build_revision_short =    "0f46a17";
# build_revision =          "0144";

RETVAL=0

ZIP_FILE_VERSIONED="Currency_Trader_Bash_Scripts_0_9_1- r-0144-0f46a17.zip"
ZIP_FILE="Currency_Trader_Bash_Scripts_0_9_1.zip"


# See how we were called.
if [[ ! `whoami` = "root" ]]; then
    echo "You must have administrative privileges to run this script"
    echo "Try 'sudo ./currency_trader_tools_install'"
    exit 1
fi
exec 5>&1
STATUS=$(zypper info rar|tee >(cat - >&5))
echo
echo $STATUS
case "$1" in
    all)
        install_all
        ;;
    *)
        echo $"Usage: currency_trader_tools_install {all}"
        exit 1
esac

exit $RETVAL

错误是:

./Currency_Trader_Bash_Scripts_0_9_1-Install-Script: command substitution: line 34: syntax error near unexpected token `('
./Currency_Trader_Bash_Scripts_0_9_1-Install-Script: command substitution: line 34: `zypper info rar|tee >(cat - >&5))'

任何建议,如何使用sh而不是bash进行相同的操作?

1 个答案:

答案 0 :(得分:1)

>(...)不是POSIX标准的一部分,因此您需要使用显式命名管道。但是,妥善管理这一点可能会变得棘手。只需捕获输出,然后显式输出到控制台。

STATUS=$(zypper info rar)
echo "$STATUS"

(该脚本已将捕获的输出输出到终端;首先似乎不需要tee。)