Управление заданиями в тире

Я не понимаю проблему, о которой жалуется стандартная оболочка в Debian (dash):

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 двусмыслен?

2 Solutions collect form web for “Управление заданиями в тире”

Это похоже на ошибку; цикл, который обрабатывает строки в этом контексте, не имеет допустимого условия выхода:

  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: sh_error(err_msg, name); 

Я предполагаю, что там должно быть goto gotit где-то …

Следующий патч исправляет это (я отправил его в поддержку вверх по течению):

 diff --git a/src/jobs.cb/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; 

По-видимому, в тире версии fg есть ошибка или ограничение, чтобы вызвать процесс при использовании строки вместо номера задания.

Что вы можете сделать, так это использовать номер вместо имени процесса, например:

 fg %1 

Мне очень жаль это говорить!

В bash он отлично работает с именем, помните, что fg является встроенной оболочкой для двух оболочек, поэтому fg bash – это не совсем та же команда в тире и может иметь разные ошибки или ограничения.

Linux и Unix - лучшая ОС в мире.