Jobliste kann nicht erfasst werden, wenn Jobs in einer Funktion aufgerufen werden

7

Ich kann grepdie Ausgabe von jobsund ich kann grepdie Ausgabe von a function. Aber warum kann ich die Ausgabe nicht abrufen, jobswenn sie in einer Funktion enthalten ist?

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

Ich sehe keinen Fehler in der Bash-Liste, aber vielleicht habe ich ihn verpasst? Es gibt einen Hinweis auf ein Problem in Bash 2.02, wenn jobses Teil einer Pipeline ist, aber nichts Neues und in einer Funktion, die ich finden kann.

Was fehlt mir hier?

Bischof
quelle
1
+1; Die Quelle scheint darauf hinzudeuten, dass Jobs auf stdout gedruckt werden
Jeff Schaller
Äh ... Ich würde einen Bug gegen Bash öffnen, da das verrückt ist.
Thrig
1
echo "$(realjobs)" | grep vifunktioniert auch.
Cas
Es funktioniert auch nicht function. function testjobs(){jobs | grep vi}und function testrealjobsgrep(){realjobs | grep vi}.Die Testjobs können funktionieren, aber der Testrealjobsgrep kann nicht funktionieren.
user164825

Antworten:

8

Eric Blake antwortete auf der Bash-Bugs-Mailingliste:

jobsist eine interessante integrierte Funktion - die Anzahl der Jobs in einer übergeordneten Shell unterscheidet sich von der Gruppe der Jobs in einer Subshell. Bash erstellt normalerweise eine Subshell, um eine Pipeline zu erstellen. Da diese Subshell keine Jobs enthält, hat die versteckte Ausführung von Jobs nichts zu melden.

Bash hat Code für Sonderfälle, jobs |wenn es offensichtlich erkennen kann, dass Sie die eingebauten Jobs als alleinigen Befehl auf der linken Seite einer Pipe ausführen, um stattdessen über die Jobs der übergeordneten Shell zu berichten, aber dieser Sonderfallcode kann nicht gekickt werden in, wenn Sie die Ausführung von Jobs ausblenden, indem Sie sie wie bisher in einer Funktion ausblenden oder auf andere Weise: eval jobs | grep vim

Bischof
quelle