diff options
Diffstat (limited to 'Userland')
-rw-r--r-- | Userland/Shell/AST.cpp | 10 | ||||
-rw-r--r-- | Userland/Shell/AST.h | 1 | ||||
-rw-r--r-- | Userland/Shell/Shell.cpp | 7 |
3 files changed, 14 insertions, 4 deletions
diff --git a/Userland/Shell/AST.cpp b/Userland/Shell/AST.cpp index d461b9fd6d..93dc4fee8e 100644 --- a/Userland/Shell/AST.cpp +++ b/Userland/Shell/AST.cpp @@ -1690,12 +1690,18 @@ IfCond::IfCond(Position position, Optional<Position> else_position, NonnullRefPt if (m_true_branch) { auto true_branch = m_true_branch.release_nonnull(); - m_true_branch = create<AST::Execute>(true_branch->position(), true_branch); + if (true_branch->is_execute()) + m_true_branch = static_ptr_cast<AST::Execute>(true_branch)->command(); + else + m_true_branch = move(true_branch); } if (m_false_branch) { auto false_branch = m_false_branch.release_nonnull(); - m_false_branch = create<AST::Execute>(false_branch->position(), false_branch); + if (false_branch->is_execute()) + m_false_branch = static_ptr_cast<AST::Execute>(false_branch)->command(); + else + m_false_branch = move(false_branch); } } diff --git a/Userland/Shell/AST.h b/Userland/Shell/AST.h index ed2d947c98..6d74f0f512 100644 --- a/Userland/Shell/AST.h +++ b/Userland/Shell/AST.h @@ -984,7 +984,6 @@ private: virtual RefPtr<Value> run(RefPtr<Shell>) override; virtual void highlight_in_editor(Line::Editor&, Shell&, HighlightMetadata = {}) override; virtual HitTestResult hit_test_position(size_t) override; - virtual bool would_execute() const override { return true; } virtual bool should_override_execution_in_current_process() const override { return true; } NonnullRefPtr<AST::Node> m_condition; diff --git a/Userland/Shell/Shell.cpp b/Userland/Shell/Shell.cpp index c6168b8882..45954c7678 100644 --- a/Userland/Shell/Shell.cpp +++ b/Userland/Shell/Shell.cpp @@ -730,7 +730,12 @@ RefPtr<Job> Shell::run_command(const AST::Command& command) } } - if (command.argv.is_empty() && !command.next_chain.is_empty() && command.should_immediately_execute_next && command.next_chain.first().node->should_override_execution_in_current_process()) { + if (command.argv.is_empty() + && !command.next_chain.is_empty() + && command.should_immediately_execute_next + && command.redirections.is_empty() + && command.next_chain.first().node->should_override_execution_in_current_process()) { + for (auto& next_in_chain : command.next_chain) run_tail(command, next_in_chain, last_return_code); return nullptr; |