mra*_*raz 5 command-line bash scripts printing c++
对于交付,我被建议将程序的完整输出打印到 txt 文件。此外,我需要使用我在执行脚本中实现的命令“time”来打印执行时间。
#!/bin/bash
time ./blur-effect 4k.png 4k_out16.png 16 15 &>> Output.txt
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是程序输出正确输出到 txt 文件,但执行时间显示在终端中,但它也必须打印在 txt 文件中。
ste*_*ver 12
如果您将命令包装在命令组或子 shell 中,它应该按照您想要的方式工作:
{ time ./blur-effect 4k.png 4k_out16.png 16 15 ; } &>> Output.txt
Run Code Online (Sandbox Code Playgroud)
或者
(time ./blur-effect 4k.png 4k_out16.png 16 15) &>> Output.txt
Run Code Online (Sandbox Code Playgroud)
在 Bash 中,time
是管道的shell 关键字,它将流重定向解释为仅在定时命令(管道)上发生;它也恰好是一个常见的 *nix 实用程序:
$ type -a time
time is a shell keyword
time is /usr/bin/time
Run Code Online (Sandbox Code Playgroud)
如果您想将流重定向到/从time
您可以使用命令组或子外壳,如 steeldriver 的回答中所述,或time(1)
显式调用实用程序:
/usr/bin/time COMMAND... &> LOGFILE
Run Code Online (Sandbox Code Playgroud)
或者如果您不确定完整路径 time
time="$(which time)"
"$time" COMMAND... &> LOGFILE
Run Code Online (Sandbox Code Playgroud)
PS:您可以将time(1)
命令的输出保存到未连接到命令的标准错误输出(这是默认值)的文件中,以防您想保留定时程序的标准错误输出而不用-o
选项更改。-a
使time
附加到该文件而不是覆盖它。
/usr/bin/time [-a] -o time.log COMMAND... >command-stdout.log 2>command-stderr.log
Run Code Online (Sandbox Code Playgroud)
使用time
shell 关键字实现相同的效果(像往常一样,使用>>
而不是>
重定向来追加而不是覆盖):
{ time COMMAND... >command-stdout.log 2>command-stderr.log; } 2>time.log
Run Code Online (Sandbox Code Playgroud)
或者保存时间日志但保留定时程序的标准错误输出:
{ time COMMAND... 2>&3; } 3>&2 2>time.log
Run Code Online (Sandbox Code Playgroud)