ダッシュボードでジョブを制御する

ダッシュボードでジョブを制御する

私は、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_msgjperr

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;

おすすめ記事