Shell: Raise an error if an execute node ends up trying to run nothing

...while capturing its standard output.
As `$()` is an invalid construct, execute nodes are not supposed to
capture the output of no command being run; but it is possible to create
empty commands such as CastToCommand(Redirection(...)) or similar.
Make this a hard error instead of an unescapable select().
This was noticed in #10432, which should now error out like so:
```
Error: Cannot capture standard output when no command is being executed
  0| $(<$file)
~~~~~^^^^^^^^^
  1|
```
This commit is contained in:
Ali Mohammad Pur 2021-10-11 10:19:04 +03:30 committed by Ali Mohammad Pur
parent 3908753347
commit 045c85af4b

View file

@ -1550,6 +1550,19 @@ void Execute::for_each_entry(RefPtr<Shell> shell, Function<IterationDecision(Non
auto commands = shell->expand_aliases(m_command->run(shell)->resolve_as_commands(shell));
if (m_capture_stdout) {
// Make sure that we're going to be running _something_.
auto has_one_command = false;
for (auto& command : commands) {
if (command.argv.is_empty() && !command.pipeline && command.next_chain.is_empty())
continue;
has_one_command = true;
break;
}
if (!has_one_command) {
shell->raise_error(Shell::ShellError::EvaluatedSyntaxError, "Cannot capture standard output when no command is being executed", m_position);
return;
}
int pipefd[2];
int rc = pipe(pipefd);
if (rc < 0) {