仪表板中的作业控制

仪表板中的作业控制

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

test@debian:~$ sh
$ man ls

ctrl+Z

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

难道不应该fg %string简单地将命令开头的作业带到string前台吗?为什么是%man暧昧呢?

答案1

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

        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;
        }

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

err:
        sh_error(err_msg, name);

我想应该有一个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;

答案2

显然,fg 的破折号版本在使用字符串而不是作业编号时启动进程时存在一些错误或限制。

您可以做的是使用数字而不是进程名称,如下所示:

fg %1 

我很抱歉这么说!

在 bash 中,它与名称配合得很好,请记住 fg 是两个 shell 的内置 shell,因此 bash 的 fg 与 dash 中的命令不完全相同,并且可能有不同的错误或限制。

相关内容