2017-10-14 113 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,所以我應該在調用樹中儘早放置墊片。 –