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 )
有没有办法完成多个嵌套命令的分离输出?
提前致谢!
答案 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有意义的变量的全大写字母名称,并保留了至少有一个小写的名称用于其他目的的角色。