Isso parece um bug; o loop que lida com strings neste contexto não t tem uma condição de saída válida:
while (1) {
if (!jp)
goto err;
if (match(jp->ps[0].cmd, p)) {
if (found)
goto err;
found = jp;
err_msg = "%s: ambiguous";
}
jp = jp->prev_job;
}
Se um trabalho corresponder à sequência, found
será definido e err_msg
será pré-carregado; em seguida, volta o ciclo, depois de definir jp
para o trabalho anterior. Quando chega ao fim, a primeira condição é correspondida, então o controle vai para err
, que imprime o erro:
err:
sh_error(err_msg, name);
Eu acho que deveria haver um goto gotit
em algum lugar ...
O seguinte patch corrige isso (enviei para o mantenedor do upstream):
diff --git a/src/jobs.c b/src/jobs.c
index c2c2332..37f3b41 100644
--- a/src/jobs.c
+++ b/src/jobs.c
@@ -715,8 +715,14 @@ check:
found = 0;
while (1) {
- if (!jp)
- goto err;
+ if (!jp) {
+ if (found) {
+ jp = found;
+ goto gotit;
+ } else {
+ goto err;
+ }
+ }
if (match(jp->ps[0].cmd, p)) {
if (found)
goto err;