Job control in dash

3

Eu não entendo o problema sobre o qual o shell padrão no Debian (dash) reclama:

test@debian:~$ sh
$ man ls

ctrl + Z

[1] + Stopped                    man ls
$ jobs
[1] + Stopped                    man ls
$ fg %man
sh: 3: fg: %man: ambiguous

O fg %string não deve trazer o trabalho cujo comando começa com string para o primeiro plano? Por que %man é ambíguo?

    
por wolf-revo-cats 01.06.2016 / 20:34

2 respostas

5

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;
    
por 01.06.2016 / 21:03
1

Aparentemente, a versão traço de fg tem algum bug ou limitação para trazer o processo ao usar uma string em vez do número do trabalho.

O que você pode fazer é usar o número em vez do nome do processo, assim:

fg %1 

Sinto muito em dizer isso!

No bash ele funciona bem com o nome, lembre-se que fg é um shell embutido para os dois shells, então fg de bash não é exatamente o mesmo comando em dash e pode ter diferentes bugs ou limitações.

    
por 01.06.2016 / 21:11