2017-10-14 111 views
1

bash很新 - 我试图将我的/ usr/bin/time命令的输出存储到TIME_INFO变量中,该变量与下面的设置一起工作...但是我也想能够将其他一些嵌套命令(例如/ usr/local/bin/firejail或./program)的输出存储到其他变量中。目前,如果./program中存在运行时异常,它也会转到TIME_INFO变量。在Bash中嵌套命令的STDOUT

TIME_INFO=$(/usr/bin/time --quiet -f "%e-%U-%S-%M-%x" 2>&1 \ 
timeout 5s \ 
/usr/local/bin/firejail --quiet --cgroup=/sys/fs/cgroup/memory/group1/tasks --profile=java.profile \ 
./program <test.in> test.out) 

有什么办法可以完成多个嵌套命令的分离输出吗?

提前致谢!要做到这一点

+0

这当然是*最简单*与临时文件。你用他们好吗? –

+0

是的,我只是使用这些数据对脚本运行的每个进程的信息进行汇总,这样可以很好。 – Gosre

+0

请参阅[捕获标准输出和stderr在不同的变量](https://stackoverflow.com/questions/11027679/store-capture-stdout-and-stderr-in-different-variables-bash)为什么一个密切相关的想法操作看起来像*没有使用临时文件。 –

回答

2

一种方式是注入一个壳在调用链,使其负责修改标准错误用于其子流程:

time_info=$(/usr/bin/time --quiet -f "%e-%U-%S-%M-%x" 2>&1 \ 
    sh -c '"[email protected]" 2>"$0"' test.err \ 
    timeout 5s \ 
     /usr/local/bin/firejail \ 
      --quiet --cgroup=/sys/fs/cgroup/memory/group1/tasks --profile=java.profile \ 
     ./program <test.in> test.out) 

# read your content back into a shell variable 
error_text=$(<test.err) 

这里的相关变化是sh -c '"[email protected]" 2>"$0",它运行它的参数作为命令,stderr重定向到传入的文件名$0 - 从sh -c传递的代码之后立即填充字符串。

注意,我修改TIME_INFO可变per POSIX guidance的指定全部大写用于与含义的壳或OS,并与用于其它目的的至少一个小写字符保留名称变量名的情况下。

+0

你能完全避开stderr吗? –

+0

@MadPhysicist,当然 - 如果你用'/ dev/null'代替'test.err',它会产生这种效果。不过,我不确定这是OP的意图。 (不能丢弃* entire *命令的stderr,因为它是'time'输出的存储位置)。 –

+0

@MadPhysicist,...说,你有一个观点,因为我们希望保留从'时间'的stderr,所以我应该在调用树中尽早放置垫片。 –