$ time (exec -a foo echo hello)
hello
它好像stderr
(其中time
將其輸出)泄漏的地方;顯然這不是我想要的。在子shell時間EXEC
我的問題可以用通用術語表述爲「爲什麼在子shell執行另一個程序時寫在終端上的標準錯誤流?」。
的幾個注意事項:
- 我需要使用
exec
其-a
開關,它改變了過程的第0個參數。我會很感激exec
的替代方案來做到這一點,但我不知道任何,現在這種行爲讓我好奇。 - 當然,我需要一個子shell,因爲我想讓我的腳本繼續。再次,任何替代方案都會受到歡迎。
exec
在一個子shell中甚至是一件好事嗎? time
'一個子外殼一般工作正常,所以它真的必須與exec
。
難道有人指着我正確的方向嗎?我不確定從哪個參考資料開始,exec
描述非常簡潔。
更新:其實,我只是「幸運」time
這裏是bash內建。它不分析所有與/usr/bin/time
或與任何其他工藝:
$ env (exec -a foo echo hello)
bash: syntax error near unexpected token `exec'
其實這是有道理的,我們不能通過一個子shell作爲參數。任何想法如何以任何其他方式做到這一點?
更新:總之,我們有四個很好的答案在這裏,所有的不同的,潛在的東西缺乏:
使用實際的文件系統的鏈接(硬或符號)是bash將默認和
time
使用一般。積分爲hek2mgl。ln $(which echo) foo && time ./foo hello && rm foo
fork
爲time
使用bash和exec
使用bash的子shell沒有特殊的語法。time bash -c 'exec -a foo echo hello'
fork
爲time
使用bash,但exec
使用一個微小的包裝。time launch -a foo echo hello
fork
和exec
使用bash的特殊語法time
。學分sjnarv。time { (exec -a foo echo hello); }
我認爲該解決方案1對time
影響較小的計時器沒有算在「代理」程序exec
,但不是很實用(許多文件系統鏈接),技術上也不理想。在所有其他情況下,我們實際上是exec
兩次:一次加載代理程序(2和4的子shell,3的包裝)以及一次加載實際程序。這意味着time
會計算第二個exec
。雖然它可能非常便宜,exec
實際上會執行文件系統查找,可能會非常慢(尤其是如果它搜索PATH
,或者本身exec*p
或代理進程)。
因此,唯一簡潔的方法(就這個問題的答案而言)將修補bash以修改其time
關鍵字,以便它可以在將第零個參數設置爲非零值時爲exec
。它可能看起來像time -a foo echo hello
。
這是有道理的,謝謝。但是,您的建議存在的問題是我無法使用bash exec的'-a'開關。我開始認爲我必須爲此寫一個C封裝器。 – tne
爲什麼不能?你可以使用-a – hek2mgl
那麼是的,但它會改變'時間'的第零個參數,而不是命令的問題(我在這裏只使用'echo'作爲一個例子,顯然),這使得使用' exec'開始。 – tne