2016-11-02 4 views
1

В bash я могу обратиться к последней работе с %+ или %%, но я не могу это сделать в /bin/sh.Refer to jobs in sh

Учитывая следующий сценарий:

#!/bin/[ba]sh 

some_job() { 
    sleep 1 
    sleep 1 
    sleep 1 
    sleep 1 
    sleep 1 
    sleep 1 
} 

some_other_job() { 
    sleep 1 
} 

echo "some_job" 
some_job & 

echo "some_other_job" 
some_other_job & 

echo "sleep" 
sleep 2 

kill %1 

jobs -l 

запуская его с bash хорошо, но исполнение его sh дает мне ошибку.

$ ./mwe.sh 
some_job 
some_other_job 
sleep 
./mwe.sh: 25: kill: No such process 

[2] + 2446 Done 
[1] + 2445 Running 
$ ps 
    PID TTY   TIME CMD 
2445 pts/0 00:00:00 mwe.sh 
2453 pts/0 00:00:00 sleep 
2494 pts/0 00:00:00 ps 
3587 pts/0 00:00:01 zsh 

Как я могу обратиться к заданиям в /bin/sh?

ответ

2

Обновление: POSIX killaccept job ids; они просто не упоминаются в резюме. Leon's answer является правильным.


POSIX kill работает только с технологическими идентификаторами, а не jobspecs. Вам нужно будет явно записать идентификатор процесса задания, которое вы хотите убить.

# [ function definitions deleted.] 

echo "some_job" 
some_job & to_kill=$! 

echo "some_other_job" 
some_other_job & 

echo "sleep" 
sleep 2 

kill "$to_kill" 

jobs -l 
1

Насколько я знаю, ваниль Bourne Shell не поддерживает контроль над работой.

+0

Означает ли это все, что я начинаю с '&' получает из-под контроля? –

+2

Следует предположить, что '/ bin/sh' относится к оболочке POSIX, а не к оболочке Bourne. – chepner

+0

Как говорит чепнер - Борн - это оболочка 1970-х годов. POSIX sh, созданный в 90-х годах, является гораздо более новым стандартом: если современные оболочки были надмножеством Борна, 'echo foo^cat' выдавал' foo' на stdout, а не 'foo^cat' - как в Bourne, в отличие от POSIX sh, '^' - символ канала. –

2

Попробуйте включить контроль за работой в одном из следующих способов:

  1. Изменить хижину строку #!/bin/sh -m
  2. Добавить set -m в качестве первой команды в сценарий

Оба метода работали для меня (с использованием dash как /bin/sh).