1

私の bash スクリプトでは、ロガー バイナリが存在するかどうかを確認する必要があります。その場合は、アプリケーションの出力をそれにパイプします。

編集--------
| パイプする必要があり、アプリケーションは永続的に機能する必要があります。
---------------

パイプラインのものを変数に入れて、後で使用しようとしました。何かのようなもの:

if [ -e /usr/bin/logger ]; then
  OUT=| /usr/bin/logger 
fi

application  param1  2>&1   $OUT   >  /dev/null &

出力はロガーにパイプされません。パイプラインをアプリケーションのスタートラインに直接配置すると、機能します。残念ながら、 if/else ステートメントでロガーを使用するコマンド ラインと使用しないコマンド ラインを使用すると、実際のスクリプトは複雑になりすぎます。

簡単なテスト アプリケーション

TMP=| wc -m
echo aas bdsd vasd $TMP

与える

$ ./test.sh
0
aas bdsd vasd

どういうわけか、command1 と command2 は別々に実行されているようです。

eval条件付きのものを二重引用符で囲んで使用することで、(テストスクリプトと実際のスクリプトの両方で)問題を解決できました。

TMP="| wc -m"
eval echo aas bdsd vasd $TMP

$ ./test.sh
14

それは回避策のように感じます。それを行う正しい方法は何ですか?

4

5 に答える 5

2

これを行う正しい方法は、次を使用することif/elseです。

if [ -e /usr/bin/logger ]
then
    application  param1  2>&1 | /usr/bin/logger >  /dev/null &
else
    application  param1 > /dev/null 2>&1 &
fi

編集:

複雑な構成の場合は、関数を使用する必要があります。

foo () {
    if [ ... ]
    then
        do_something
    else
        something_else
    fi
    while [ ... ]
    do
        loop_stuff
    done
    etc.
}

次に、ログ/ログなしifはシンプルなままです:

if [ -e /usr/bin/logger ]
then
    foo  2>&1 | /usr/bin/logger >  /dev/null &
else
    foo > /dev/null 2>&1 &
fi
于 2010-10-13T14:34:28.597 に答える
2

別のオプションをミックスに投入するだけで、パイプを変数の外に移動できます。

if [ -e /usr/bin/logger ]; then
    logcmd=/usr/bin/logger
else
    logcmd=/bin/cat
fi

application param1 2>&1 | $logcmd >/dev/null &

これにより、2 つのケースでコマンドが重複することを回避できます (または、Dennis の提案に従って、すべてを関数でラップする必要があります)。欠点は、ロガーが存在しない場合の処理​​方法が非効率であることですcat。出力を /dev/null にフィードするためだけにプロセスを作成するのは完全に無駄です。ただし、catプロセスはそれほど大きなリソースの浪費ではないため、コードがよりクリーンになるのであれば、無駄にする価値があるかもしれません。

于 2010-10-13T16:03:03.133 に答える
1

試す

if [ -e /usr/bin/logger ]; then
  logger $(application  param1 2>&1)
fi

一般的な規則:コマンドを変数内に配置したり、変数を介して呼び出したりしないでください。スクリプトから直接実行するだけです。

于 2010-10-13T09:57:16.850 に答える
0

私は同様のコードを試し、このように最後の行を指定しました、そしてそれはうまくいきました

application  param1  &2>1   ${OUT}   >  /dev/null
于 2010-10-13T10:01:34.627 に答える
0

Ghostdog74の答えは正しいですが、これを機能させる方法は確かにあります

if [ -e /usr/bin/logger ]; then
  OUT='| /usr/bin/logger'
fi

eval application param1 2>&1 $OUT > /dev/null

しかし、eval を使用する前によく考えてから使用しないことを強くお勧めします。

于 2010-10-13T11:51:28.907 に答える