【问题标题】:bash script write executing time in a filebash脚本在文件中写入执行时间
【发布时间】:2012-10-22 00:18:44
【问题描述】:

我需要将执行此命令所用的时间写在一个txt文件中:

time ./program.exe

如何在 bash 脚本中进行操作?

我尝试使用 >> time.txt 但这不起作用(输出不会进入文件并进入屏幕)。

【问题讨论】:

标签: bash


【解决方案1】:

只需将要计时的命令括在{ .. } 中:

{ time ./program.exe; } 2>&1

当然,内置时间的输出到stderr,因此需要重定向2>&1

然后,捕获输出可能看起来很棘手,让我们使用第二个{ .. } 来更轻松地读取命令,这样可以:

{ { time ./program.exe; } 2>&1; } >> time.txt              # This works.

但是,正确的构造应该只是将捕获反转,如下所示:

{ time ./program.exe; } >> time.txt  2>&1;                 # Correct.

要关闭命令的任何可能输出,请将其输出重定向到 /dev/null,如下所示:

{ time ./program.exe >/dev/null 2>&1; } >> time.txt 2>&1   # Better.

而且,由于现在只有 stderr 上的输出,我们可以简单地捕获它:

{ time ./program.exe >/dev/null 2>&1; } 2>> time.txt       # Best.

./program 的输出应该被重定向,或者它很可能在 time.txt 内结束。

【讨论】:

    【解决方案2】:

    time_elapsed=(time sh -c "./program.exe") 2>&1 | grep "real" | awk '{print $(NF)}' echo time_elapsed > file.txt 此命令应为您提供所需文件中 bash 消耗的确切时间。

    您也可以使用 2 > file.txt 将其重定向到文件,如另一个回复中所述。

    【讨论】:

    • 使用 TIMEFORMAT 控制 bash 内置时间输出(则不需要grep + awk)。
    【解决方案3】:

    bash 中获取time 写入文件是一项艰巨的工作。这是一个bash 内置命令。 (在 Mac OS X 上,有一个外部命令 /usr/bin/time,它执行类似的工作,但输出格式不同且不那么顽固。)

    你需要使用:

    (time ./program.exe) 2> time.txt
    

    它写入标准错误(因此使用2> 表示法)。但是,如果您不使用子外壳(括号),它就不起作用;输出仍然出现在屏幕上。


    或者,如果没有子外壳,您可以使用:

    { time ./program.exe; } 2> time.txt
    

    注意左大括号和分号后面的空格;两者都是单行所必需的。大括号必须出现在命令可能出现的位置,并且必须是独立符号。 (如果你足够努力,你会想出...;}|something...;}2>&1。不过,这两个都将大括号识别为独立符号。如果你尝试...;}xyz,shell 将(可能)找不到不过,一个名为 }xyz 的命令。)


    我需要在更多终端中运行更多命令。如果我这样做:

     xterm -xrm '*hold: true' -e (time ./Program.exe) >> time.exe & sleep 2
    

    它不起作用并告诉我Syntax error: "(" unexpected。我该如何解决这个问题?

    您需要执行以下操作:

    xterm -xrm '*hold: true' -e sh -c "(time ./Program.exe) 2> time.txt & sleep 2"
    

    关键的变化是使用来自-c 选项的参数的脚本运行shell;您可以将 sh 替换为 /bin/bash 或等效名称。这应该可以解决任何“语法错误”问题。不过,我不太确定是什么触发了该错误,因此可能有一种更简单、更好的方法来处理它。也可以想象xterm-e 选项只接受一个字符串参数,在这种情况下,我想你会使用:

    xterm -xrm '*hold: true' -e 'sh -c "(time ./Program.exe) 2> time.txt & sleep 2"'
    

    您可以像我一样手动 bash xterm

    我不确定您为什么在后台模式下运行定时程序,但这是您的问题,不是我的问题。同样,如果hold: true 保持终端打开,sleep 2 显然不是必需的。

    【讨论】:

    • 我需要在更多终端中运行更多命令。如果我这样做 xterm -xrm '*hold: true' -e (time ./Program.exe) 2> time.exe & sleep 2 dont work 并告诉我语法错误:“(”意外
    【解决方案4】:

    重定向 bash 内置 time 的输出并不容易。

    一种解决方案是使用外部time 程序:

    /bin/time --append -o time.txt ./program.exe
    

    (在大多数系统上它是一个 GNU 程序,所以使用info time 而不是man 来获取它的文档)。

    【讨论】:

    • 注意:这不适用于 bash 函数。 GNU time 的参数必须是路径中可用的命令。
    猜你喜欢
    • 2018-01-25
    • 2011-03-18
    • 2015-04-07
    • 2016-09-19
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    相关资源
    最近更新 更多