2017-10-20 7 views
0

シェルストリームのリダイレクトに関するすべての質問と回答で、私は自分のものを投稿していますが、何も見つからないようです同様のオンライン。シェルリダイレクト:stdoutまたはstderrにコマンドが出力されないように見える

私の状況を簡単に説明するために、私は特定のバイナリアプリケーションを実行し、特定の文字列の出力を監視してそれらが動作するようにするbashスクリプトを作成しようとしています。

私のバイナリアプリケーションのために立っていたテストスクリプトを使用して、目的の機能を達成することができました。しかし、実際のものとは対照的に、すべての出力をキャプチャしているようには見えません。私は一人でバイナリアプリケーションを実行すると、そのような

status OK 
something A 
something B 
... 
something Z 
status OK 
something A 

として出力しかし、私は、分析のために、この出力をリダイレクトしようとすると、私は唯一の「ステータスOK」行を取得します。間にあるすてきなものは欠けています。これは>でファイルにリダイレクトしようとしても当てはまります。最初は私はstdoutに "status"を、stderrに "something"を置くかもしれないと思ったが、それはそうではないようだ。

私はこのアプリが私が読むことができる端末に物を出力することができる場合、どのようにそれをキャプチャできませんか?それは、ターミナルディスプレイによって正しく解釈されるようにフォーマットが奇妙になる可能性はありますが、何らかのリダイレクトによっては何とか解釈されませんか?

洞察力があれば幸いです!

+0

[最小限で完全で検証可能な例を作成する方法](http://stackoverflow.com/help/mcve)をご覧ください。あなたの質問にあなたのコードを追加してください。 – Cyrus

+1

本当にバイナリアプリケーションが何をしているかによって異なります。出力を/ dev/ttyに送信している可能性があります。 stdoutおよび/またはstderrがターミナルデバイスであるかどうかを調べるかもしれません。それは...ほとんど何でもするかもしれない。 –

+0

@Cyrus法的な理由で正確なコードを投稿できませんが、バイナリアプリには重要な詳細が表示されず、ソースコードもありません。私の質問は主に、アプリが>または2>を経由してリダイレクトできない方法で端末にテキストを出力する可能性がある方法を理解することです。しかし、ええ、私はそれがかなり開放的な質問だと理解しています。 – Matt

答えて

0

@Gordon Davissonはお金の上にあります。出力が直接/ dev/ttyに送信されたように見えますが、これは明らかに人々が行うことです...ありがとう、ゴードン!

更新:さらに他の人が入力して入力すると、重要な部分がscriptを使用してすべての出力をキャプチャしているように見えます。追加のリダイレクト(つまり、2>&1)は必要ではありませんが、必要に応じて実行できます。それを実際に見るには下に続けてください。/dev/ttyが、「binApp」と呼ばれるにデータを送信してのは、それは、コマンドライン引数の任意の数をとりましょう

バイナリアプリ:

は、ここに私の基本的なコードです。私のラッパー/ウォッチャースクリプトはそうのように、binAppとそのすべての引数で実行されます。

WrapScript binApp arg1 arg2 ... argn

WrapScriptを:

#!/bin/bash 

args=("[email protected]") 
cmd=`echo "${args[@]:0}"` 

run() { 
    script -q -c "$cmd" 2>&1 | while read -r line; do 
     if [ "$line" = "$badthing" ]; then 
      echo "restarting..." 
      break 
     fi 
     echo "$line" 
    done 
} 

badthing="ERROR" 

while true; do 
    run 
    sleep 0.5 
done 

sleep 0.5は、ユーザーが "Ctrlキー+ C" が2回終了する押すことができます。

+0

あなたの定義は '{'で始まり、 'done'で終わります - それは確かに正しくありません。 'function'キーワードを避けることを考えてください。POSIX準拠の関数定義構文が優先されます。これは単に関数'前に 'run(){'だけです。あなたのコードはより広い範囲のシェルで動作します。 –

+0

@CharlesDuffy良いキャッチ、ありがとう。 – Matt

0

/dev/null>&1の代わりに2>&1を入力してください。 stderrをstdoutにリダイレクトすると、どちらの方法でも実行されます。

+0

何らかの理由で、私は '/ dev/null>&1'がこのすべての仕事をしていた魔法の弾丸だと思っていましたが、' 2>&1'とリダイレクトを使用しないようにしました。それは本当にすべての仕事をしている 'スクリプト'のようだ。ありがとう! – Matt

関連する問題