Disable job control inside command substitutions

This disables job control inside command substitutions. Prior to this
change, a cmdsub might get its own process group. This caused it to fail
to cancel loops properly. For example:

    while true ; echo (sleep 5) ; end

could not be control-C cancelled, because the signal would go to sleep,
and so the loop would continue on. The simplest way to fix this is to
match other shells and not use job control in cmdsubs.

Related is #1362
This commit is contained in:
ridiculousfish
2021-07-26 13:12:30 -07:00
committed by David Adam
parent d27f477ba6
commit 2ca66cff53
6 changed files with 43 additions and 3 deletions

View File

@@ -1342,10 +1342,12 @@ end_execution_reason_t parse_execution_context_t::run_1_job(const ast::job_t &jo
const auto &ld = parser->libdata();
auto job_control_mode = get_job_control_mode();
// Run all command substitutions in our pgroup.
bool wants_job_control =
(job_control_mode == job_control_t::all) ||
((job_control_mode == job_control_t::interactive) && parser->is_interactive()) ||
(ctx.job_group && ctx.job_group->wants_job_control());
!parser->is_command_substitution() &&
((job_control_mode == job_control_t::all) ||
((job_control_mode == job_control_t::interactive) && parser->is_interactive()) ||
(ctx.job_group && ctx.job_group->wants_job_control()));
job_t::properties_t props{};
props.initial_background = job_node.bg.has_value();