bash - 将bash时间命令的输出加载到变量

  显示原文与译文双语对照的内容
136 4

让我们在分层中检查我的问题:

sleep 3; echo hello

休眠3 秒钟并回显"hello"

ssh localhost"sleep3; echo hello"

在远程主机上通过ssh执行相同操作

var=$(ssh localhost"sleep3; echo hello")

相同但在 var 中存储"打招呼"

(time var=$(ssh localhost"sleep3; echo hello")) 2>&1

这样做和时间是否相同,但是自从时间输出到stderr之后,我将stderr重定向到 stdout,这样我就可以

timer=$((time var=$(ssh localhost"sleep3; echo hello")) 2>&1)

操作应该使远程机器等待 3秒,回显"打招呼"应该存储在机器 var的本地变量上,然后时间将整个进程存储在变量中,然后存储在变量中。

但不幸的是,var 是空的( 它在 #3)!对于我的代码,需要在一个变量中存储ssh的输出,而另一个变量则不使用"更高级"命令 /bin/timedate 。等等 。我肯定有一个聪明的( 例如 。只有这样做的方法,但我不够聪明,我不能够自己解决。任何帮助都非常有用。

下面是一个可能有用的线程:[ 如何在Bash脚本中存储变量中的标准错误。

时间:原作者:0个回答

98 5

命令在括号内运行,或者在执行命令替换时运行在子shell中。subshell中的变量在子shell完成后不存在。最简单的解决方案是使用 file:

timer=$(time ssh localhost"sleep 3; echo hello" 2>&1>/tmp/var)
var=$(</tmp/var)
原作者:
52 4

barmar的答案很好,但是缺少括号( 计时器泄漏到 stdout ) 。正确的答案是:

time=$((time ssh localhost"sleep 3; echo hello" &>/tmp/key) 2>&1); key=$(</tmp/key)

这样,远程机器等待 3秒,回显"打招呼"存储在机器var的本地变量中,然后时间将计时值存储在变量计时器中,同时完成全部静默。

原作者:
...