Job-Control

dash中的作業控制

  • June 2, 2016

我不明白 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模棱兩可?

這看起來像一個錯誤;在此上下文中處理字元串的循環沒有有效的退出條件:

       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;

引用自:https://unix.stackexchange.com/questions/286979