summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAli Mohammad Pur <ali.mpfard@gmail.com>2021-10-11 10:19:04 +0330
committerAli Mohammad Pur <Ali.mpfard@gmail.com>2021-10-11 10:56:01 +0330
commit045c85af4b68e7444d52be4e61d660637a456557 (patch)
tree9c05f684257b9f9ad336d1e69fac60dfa04584a2
parent39087533475cd82dfe9228d144a8c57d1912b771 (diff)
downloadserenity-045c85af4b68e7444d52be4e61d660637a456557.zip
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| ```
-rw-r--r--Userland/Shell/AST.cpp13
1 files changed, 13 insertions, 0 deletions
diff --git a/Userland/Shell/AST.cpp b/Userland/Shell/AST.cpp
index c7e7ebcc2e..954254828c 100644
--- a/Userland/Shell/AST.cpp
+++ b/Userland/Shell/AST.cpp
@@ -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) {