将延迟的 shell 输出存储到变量中?

将延迟的 shell 输出存储到变量中?

我有一个脚本,它将命令的输出存储在变量中,如下所示:

my_var=$(命令)

但是,一些输出没有存储在变量中,我假设是因为它被延迟了......我确信它被延迟了,因为它在将输出存储在变量中之后将我想要的行输出到屏幕,我尝试过处理它...

[编辑]重要!事实证明输出将发送到 stderr[/编辑]

在将输出存储到变量之前,如何让它等待退出代码(当 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 protocol error) 似乎是在命令的输出存储在变量中之后出现的

答案1

除非该进程正在后台运行或分叉,否则不会是由于延迟造成的。您可以通过快速测试来验证这一点:

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

该命令直到执行完毕才完成sleep,之后发送到标准输出的消息成功存储到变量中。由此,我们可以推测出几点:

  • 在命令完成之前不会存储该变量。
  • STDOUT 在命令执行期间保持连接状态。

此时,这里发生了以下两件事之一:

  • 该消息没有被写入 STDOUT:它可能被写入 STDERR。
  • 该命令实际上正在完成。 (后台、分叉子进程等)

通常问题是前者。

相关内容