2016-05-11 5 views
0

コマンド出力をbashで変数に取り込みたいのですが、コンソールに表示することもできます。コマンド出力のリダイレクトは、スクリプトからではなくコンソールからのみ実行されます。

これは、コンソールに期待される方法で動作します。次の単純なスクリプトの中で呼び出すとき、それは期待通りに機能します。

#!/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のではないですか?

+0

はあなたがいうだけで変化しないよろしいですあなたのシバンを '#!/ bin/bash'に送りますか?あなたが実行しているシステムでは 'bash'が' sh '(エラーメッセージに基づいて)としてインストールされています。これは '[..]]'と '$" .. "すでに 'bash'が必要です。 –

+0

はい、私は確信しています。 OpenSUSEではbashに切り替えることができます。しかし、私は本当に答えを知りたい。ありがとう –

答えて

1

>(...)はPOSIX標準の一部ではないため、明示的な名前付きパイプを使用する必要があります。しかし、これを適切に管理するのは難しいことがあります。出力をキャプチャしてコンソールに明示的に出力します。

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

(スクリプトが既に端末に取り込んだ出力を出力している;最初の場所でteeの必要性があるとは思えない)

+0

しかし、コンソールへの出力は、エコーを使った書き込みよりはるかに優れた構造になっています。だから私はこれをshを使って動作させる方法を探していますが、STATUSをエコーする良いオプションはありません。 –

+0

'$ STATUS'を引用すると(John Kugelmanが私のために修正したように)、出力は同じになります。 – chepner

+0

それは同じではない、試してみてください。 echo $ STATUS実際に長い行だけを表示します。改行はありませんので、それは違った見方であり、それほど有用ではありません。また、時間のかかるタスクを使用する場合、リダイレクションはタスクの間だけでなく、最後に印刷します。 –

関連する問題