나는 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의 명령과 정확히 동일하지 않으며 다른 버그나 제한 사항이 있을 수 있습니다.