2016-10-26 9 views
0

サブ関数(のような対話式の操作で、のように)を実行してログを保持したいとします。bashで戻りコードとサブ関数のログを保持する方法

オリジナル

#!/bin/bash 
foo() { 
    echo "Error" 
    return 1 
} 
bar() { 
    local data 
    read -p "data=" data 
    echo "OK: $data" 
    return 0 
} 
foo 
echo "Return code=$?" 
bar 
echo "Return code=$?" 

した後、戻り値送信するために、名前付きパイプを使用し

#!/bin/bash 
foo() { 
    echo "Error" 
    return 1 
} 
bar() { 
    local data 
    read -p "data=" data 
    echo "OK: $data" 
    return 0 
} 
LOG=my.log 
foo | tee -a $LOG 
echo "Return code=$?" 
bar | tee -a $LOG 
echo "Return code=$?" 
+0

デフォルトでは、パイプの終了ステータスは、パイプ内の最後のコマンドの終了ステータスです。 ** pipefail **オプション( 'set -o pipefail')を設定することはできますが、何らかの理由でパイプの' tee'コマンドが失敗した場合でも、間違った終了コードを得ることができます。ファイル)。 – Leon

答えて

0

ログを保存:teeを実行するための

#!/bin/bash 
foo() { 
    echo "Error" 
    return 1 
} 
bar() { 
    echo "OK" 
    return 0 
} 

rm -f retcode 
trap 'rm -f retcode' EXIT 
mkfifo retcode 

LOG=my.log 
{ 
    foo 
    echo $? > retcode 
} | tee -a $LOG & 
read rc < retcode 
echo "Return code=$rc" 
{ 
    bar 
    echo $? > retcode 
} | tee -a $LOG & 
read rc < retcode 
echo "Return code=$rc" 
0

使用プロセス置換を。これは、>(...)内のプロセスの戻りコードが失われるという事実を利用しています。

#!/bin/bash 
foo() { 
    echo "Error" 
    return 1 
} 
bar() { 
    echo "OK" 
    return 0 
} 
LOG=my.log 
foo > >(tee -a $LOG) 
echo "Return code=$?" 
bar > >(tee -a $LOG) 
echo "Return code=$?" 
+0

stderrとstdoutをリダイレクトすることは可能ですか? –

+0

これをテストしましたが、私のバー機能はインタラクティブな操作が必要です。私はまだログを保持することはできますか? –

関連する問題