소스 검색

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|
```
Ali Mohammad Pur 3 년 전
부모
커밋
045c85af4b
1개의 변경된 파일13개의 추가작업 그리고 0개의 파일을 삭제
  1. 13 0
      Userland/Shell/AST.cpp

+ 13 - 0
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));
     auto commands = shell->expand_aliases(m_command->run(shell)->resolve_as_commands(shell));
 
 
     if (m_capture_stdout) {
     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 pipefd[2];
         int rc = pipe(pipefd);
         int rc = pipe(pipefd);
         if (rc < 0) {
         if (rc < 0) {