함수에서 작업을 호출할 때 작업 목록을 grep할 수 없습니다.

함수에서 작업을 호출할 때 작업 목록을 grep할 수 없습니다.

grep을 출력 할 수 있습니다 . 을 출력 jobs할 수 있습니다 . 그런데 왜 함수의 출력을 grep할 수 없나요 ?grepfunctionjobs

$ # 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 목록에는 오류가 표시되지 않지만, 제가 놓친 것이 아닐까요? 참고자료가 있다배쉬 2.02의 문제점when jobs은 파이프라인의 일부이지만 내가 찾을 수 있는 가장 가까운 기능은 아닙니다.

내가 여기서 무엇을 놓치고 있는 걸까요?

답변1

에릭 블랙답변됨bash-bugs 메일링 리스트:

jobs흥미로운 내장 명령입니다. 상위 셸의 작업 집합은 하위 셸의 작업 집합과 다릅니다. Bash는 일반적으로 파이프라인을 실행하기 위해 서브셸을 생성하며, 서브셸에는 작업이 없으므로 작업의 숨겨진 실행에 대해 보고할 내용이 없습니다.

Bash에는 jobs |상위 셸의 작업을 보고하기 위해 파이프 왼쪽의 유일한 명령으로 내장 작업을 실행하고 있음을 시각적으로 알려주는 특수 사례 코드가 있지만 실행을 숨기면 해당 특수 사례 코드를 시작할 수 없습니다. 함수에서도 숨기나요? 또는 다음과 같은 다른 방법으로 작업을 숨깁니다. eval jobs | grep vim

관련 정보