我有一个脚本,它将命令的输出存储在变量中,如下所示:
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。
- 该命令实际上正在完成。 (后台、分叉子进程等)
通常问题是前者。