dash 中的作业控制

viu*_*ser 3 dash job-control

我不明白 Debian (dash) 中的标准 shell 抱怨的问题:

test@debian:~$ sh
$ man ls
Run Code Online (Sandbox Code Playgroud)

ctrl+Z

[1] + Stopped                    man ls
$ jobs
[1] + Stopped                    man ls
$ fg %man
sh: 3: fg: %man: ambiguous
Run Code Online (Sandbox Code Playgroud)

不应该fg %string简单地将命令开头的工作string带到前台吗?为什么有%man歧义?

Ste*_*itt 5

这看起来像一个错误;在此上下文中处理字符串循环没有有效的退出条件:

        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;
        }
Run Code Online (Sandbox Code Playgroud)

如果作业与字符串匹配、found已设置并err_msg已预加载;然后在设置jp为上一个作业后再次循环。当它到达末尾时,第一个条件匹配,因此控制转到err,打印错误:

err:
        sh_error(err_msg, name);
Run Code Online (Sandbox Code Playgroud)

我想应该有一个goto gotit地方...

以下补丁修复了这个问题(我已将其发送给上游维护者):

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;
Run Code Online (Sandbox Code Playgroud)