Porque há duas linhas no último caso, uma sendo mostrada, uma não porque está sendo mostrada em um subshell com uma nova linha que está sendo contada. Verifiquei zsh
e bash
, esse comportamento existe em zsh
, bash
se comporta de maneira semelhante com formatação diferente.
Veja o seguinte dump ASCII de zsh
:
/tmp/test% jobs
[1] + running tail -f /var/log/syslog
/tmp/test% jobs | wc -l
1
/tmp/test% jobs | od -c
0000000 [ 1 ] + r u n n i n g
0000020 t a i l - f / v a r / l
0000040 o g / s y s l o g \n
0000052
/tmp/test% cd ..
/tmp% jobs | wc -l
2
/tmp% jobs | od -c
0000000 [ 1 ] + r u n n i n g
0000020 t a i l - f / v a r / l
0000040 o g / s y s l o g \n ( p w d n
0000060 o w : / t m p ) \n
0000072
Parece que o shell está acompanhando o diretório de trabalho atual, olhe para ( p w d n
0000060 o w : / t m p )
, os parênteses indicam subshell.
Aqui está o código-fonte relevante de zsh
, jobs.c
:
/* print "(pwd now: foo)" messages: with (lng & 4) we are printing
* the directory where the job is running, otherwise the current directory
*/
if ((lng & 4) || (interact && job == thisjob &&
jn->pwd && strcmp(jn->pwd, pwd))) {
doneprint = 1;
fprintf(fout, "(pwd %s: ", (lng & 4) ? "" : "now");
fprintdir(((lng & 4) && jn->pwd) ? jn->pwd : pwd, fout);
fprintf(fout, ")\n");
fflush(fout);
}
Embora bash
tenha:
if (strcmp (temp, jobs[job_index]->wd) != 0)
fprintf (stream,
_(" (wd: %s)"), polite_directory_format (jobs[job_index]->wd));
Para obter o que você deseja, você pode executar jobs
em um subshell:
( jobs ) | wc -l