Não é possível executar a lista de tarefas quando as tarefas são chamadas em uma função

6

Eu posso grep a saída de jobs e posso grep a saída de function . Mas por que não posso grep a saída de jobs quando está em uma função?

$ # 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

Eu não estou vendo um bug na lista de bash, mas talvez eu tenha perdido isso? Há referência a um problema no Bash 2.02 quando jobs faz parte de um pipeline, mas nada recente e em uma função que eu possa encontrar.

O que estou perdendo aqui?

    
por bishop 27.04.2016 / 22:17

1 resposta

7

Eric Blake respondeu na lista de discussão do bash-bugs:

jobs is an interesting builtin - the set of jobs in a parent shell is DIFFERENT than the set of jobs in a subshell. Bash normally creates a subshell in order to do a pipeline, and since there are no jobs in that subshell, the hidden execution of jobs has nothing to report.

Bash has code to special-case jobs | when it can obviously tell that you are running the jobs builtin as the sole command of the left side of a pipe, to instead report about the jobs of the parent shell, but that special-case code cannot kick in if you hide the execution of jobs, whether by hiding it inside a function as you did, or by other means such as: eval jobs | grep vim

    
por 28.04.2016 / 19:04