次の変数にコマンド出力を格納するスクリプトがあります。
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に書き込まれます。
- コマンドは実際に完了しています。 (バックグラウンド、分岐サブプロセスなど)
通常問題は電子です。