jobs / wc: obtendo valores de retorno estranhos

1

Não consigo entender esses valores de retorno.

Quando executo jobs -s | wc -l , obtenho resultados diferentes dependendo do diretório em que estou.

Se eu estiver no diretório para o qual voltei depois de suspender o trabalho, obtenho a resposta correta.

Se eu estiver em outro diretório, obtenho a resposta correta + 1.

Veja a captura de tela:

Tambémcorrijobs-s|>test.txteobtiveumdocumentodelinhaúnica,depoisexecuteiwc-l<test.txteobtiveasaídacorreta.

Algumaideiadoqueestácausandoisso?Comovocêpodever,estáatrapalhandomeuindicadordetrabalhosemsegundoplanonopromptdomeushell(ladodireito,azul).

Qualquersugestãosobrecomocorrigirestafunçãoseriamuitoapreciada:

#tellsushowmanyjobsareinthebackgroundfunctionjobs_status(){count=$(jobs-s|wc-l)if[[$count-ne"0" ]]; then
    echo "$bg_jobs$split$fg_text $count $fg_jobs"
  fi
}
    
por JoshuaD 28.12.2015 / 07:50

1 resposta

3

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
    
por 28.12.2015 / 08:02

Tags