Почему `bash -c '...'` завершается рано на некоторых (но не на всех) ошибках? - PullRequest
0 голосов
/ 05 мая 2019

Что здесь происходит?

Следующее работает как ожидалось:

$ bash -c 'false; echo $?'
1

Но попытка уничтожить несуществующий процесс с помощью pkill приводит к завершению работы bash до завершения сценария.

$ bash -c 'pkill -f xyz_non_existent_process_xyz; echo $?'
[1]    21078 terminated  bash -c 'pkill -f xyz_non_existent_process_xyz; echo $?'

Если я запускаю эту команду в терминале, я вижу, что pkill возвращает код ошибки 1, как и команда false:

$ pkill -f xyz_non_existing_process_xyz; echo $?
1

Итак, две команды возвращают один и тот же код состояния ... в чем же разница!?

Я попытался обернуть команду несколькими способами. Например:

$ bash -c '(pkill -f xyz_non_existent_process_xyz || true); echo $?'
[1]    21309 terminated  bash -c '(pkill -f xyz_non_existent_process_xyz || true); echo $?'

Похоже, что все, что заставляет bash завершаться раньше, это не состояние завершения какой-либо из команд ??

Что здесь происходит?

1 Ответ

3 голосов
/ 05 мая 2019

Все просто: pkill находит команду bash и останавливает ее выполнение. Измените шаблон поиска, и он будет работать:

  bash -c 'pkill -f "xyz_n""on_existent_process_xyz"; echo $?'

Это немного сложно: "xyz_n""on_existent_process_xyz" такое же, как xyz_non_existent_process_xyz

...