我不明白 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
歧义?
这看起来像一个错误;在此上下文中处理字符串的循环没有有效的退出条件:
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)