遅延シェル出力を変数に保存しますか?

遅延シェル出力を変数に保存しますか?

次の変数にコマンド出力を格納するスクリプトがあります。

my_var=$(コマンド)

ところで、出力の一部が変数に保存されていないのに、遅れてしまってそうなのですが… 出力を変数に保存した後、画面に私が欲しいラインを出力するので、遅延されるのは確かで、処理してみたのですが。

[編集]重要!出力がstderr [/edit]に送信されることがわかりました。

出力を変数に保存する前に終了コード(出力が100%完了した場合)を待つようにするにはどうすればよいですか?

例を挙げていません。私の考えではユーザーはこれが邪悪だと文句を言うでしょう。しかし、そうではなく、私は私のサーバーでスクリプトを実行しています。リクエストの例:

# Grab the output, so we can check for error... If error then retry same password after wait time
outpt="$(hydra -l $hydra_user -P $tmp_passwds $hydra_all_params $hydra_host $hydra_module)"

# Grep for "ssh protocol error" line
banln=$(echo "$outpt" | grep 'ssh protocol error')

# Show ban status, update wait_time
if [ "$banln" != "" ];then
    echo "[STATUS] Oops, we got banned! (increasing wait_time + 1 second)"
wait_time=$wait_time+1

# Start retry procedure until not banned

fi

この例の問題は、私が探している行([ERROR] sshプロトコルエラー)が、コマンドの出力が変数に保存された後に出てくるようです。

答え1

プロセスがバックグラウンドで実行中または分岐しない限り、待ち時間によるものではありません。簡単なテストでこれを確認できます。

# FOO=$(sleep 10; echo whee;); echo $FOO
whee

コマンドは実行されるまで完了しません。sleepその後、標準出力に送信されたメッセージは変数に正常に保存されます。これにより、次のようないくつかの点を推論できます。

  • コマンドが完了するまで変数は保存されません。
  • STDOUT は命令実行中に接続された状態を維持します。

この時点で、次の2つのうちの1つが発生します。

  • メッセージはSTDOUTに書き込まれず、STDERRに書き込まれます。
  • コマンドは実際に完了しています。 (バックグラウンド、分岐サブプロセスなど)

通常問題は電子です。

関連情報