Bash

在函式中呼叫作業時無法 grep 作業列表

  • April 28, 2016

我可以grep輸出jobs,也可以grep輸出 a function。但是為什麼我不能 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

引用自:https://unix.stackexchange.com/questions/279592