대시보드에서 작업 제어

대시보드에서 작업 제어

나는 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;

답변2

분명히 fg의 대시 버전에는 작업 번호 대신 문자열을 사용할 때 프로세스를 시작하는 데 몇 가지 버그나 제한이 있습니다.

당신이 할 수 있는 일은 다음과 같이 프로세스 이름 대신 숫자를 사용하는 것입니다.

fg %1 

그런 말을 해서 미안해요!

bash에서는 이름과 잘 어울리며 fg는 두 쉘 모두에 내장된 쉘이므로 bash의 fg는 dash의 명령과 정확히 동일하지 않으며 다른 버그나 제한 사항이 있을 수 있습니다.

관련 정보