Job-Control
dash中的作業控制
我不明白 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;