Bash

时间:2017-10-14 15:06:52

标签: linux bash

bash的新手 - 我正在尝试将/ usr / bin / time命令的输出存储到TIME_INFO变量中,该变量适用于以下设置...但是我也希望能够存储某些其他嵌套命令(例如/ usr / local / bin / firejail或./program)的输出到其他变量。目前,如果./program中存在运行时异常,它也将转到TIME_INFO变量。

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 )

有没有办法完成多个嵌套命令的分离输出?

提前致谢!

1 个答案:

答案 0 :(得分:2)

这样做的一种方法是在调用链中注入一个shell,并让它负责修改stderr的子进程:

time_info=$( /usr/bin/time --quiet -f "%e-%U-%S-%M-%x" 2>&1 \
  sh -c '"$@" 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 '"$@" 2>"$0",它将参数作为命令运行,stderr重定向到$0中传递的文件名 - 在代码传递sh -c之后立即从字符串填充1}}。

请注意,我修改了TIME_INFO变量per POSIX guidance的情况,指定了对shell或OS有意义的变量的全大写字母名称,并保留了至少有一个小写的名称用于其他目的的角色。