Bash
在函式中呼叫作業時無法 grep 作業列表
我可以
grep
輸出jobs
,也可以grep
輸出 afunction
。但是為什麼我不能 grepjobs
它在函式中的輸出呢?$ # yes, i can grep jobs $ jobs [1]+ Running vim [2]+ Stopped matlab $ jobs | grep vim [1]+ Running vim $ # yes, of course i can grep a function $ type mockjobs mockjobs is a function mockjobs () { echo '[1]+ Running vim banjo' } $ mockjobs | grep vim [1]+ Running vim banjo $ # now put those two together and surely I can grep??? $ type realjobs realjobs is a function realjobs () { jobs } $ realjobs | grep vim $ # Nope, WTF? $ bash --version GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu) $ # funny though, redirection works just fine: $ tmpfile=$(mktemp); realjobs > $tmpfile; grep vim $tmpfile; rm $tmpfile [1]+ Running vim
我沒有在 bash 列表中看到錯誤,但也許我錯過了?在 Bash 2.02 中提到了一個問題,它是
jobs
管道的一部分,但在我能找到的函式中並沒有最近的內容。我在這裡想念什麼?
Eric Blake在 bash-bugs 郵件列表中回答:
jobs
是一個有趣的內置函式 - 父 shell 中的作業集與子 shell 中的作業集不同。Bash 通常會創建一個子 shell 來執行管道,並且由於該子 shell 中沒有作業,因此作業的隱藏執行沒有什麼可報告的。Bash 具有特殊情況的程式碼,
jobs |
當它可以清楚地告訴您正在執行內置作業作為管道左側的唯一命令時,改為報告父 shell 的作業,但特殊情況程式碼無法啟動如果您隱藏作業的執行,無論是像您一樣將其隱藏在函式中,還是通過其他方式,例如:eval jobs | grep vim