私は、Debianの標準シェル(ダッシュ)が次のことについて文句を言うことを理解していません。
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;