From 21ea9cedff4f945a691950900b7f3b99c08b9e3a Mon Sep 17 00:00:00 2001 From: Ali Mohammad Pur Date: Thu, 21 Sep 2023 02:31:23 +0330 Subject: [PATCH] Shell: Add the POSIX-only 'eval' builtin This just concatenates its arguments together, and executes it as a command. --- Userland/Shell/Builtin.cpp | 25 +++++++++++++++++++++++++ Userland/Shell/Shell.h | 1 + 2 files changed, 26 insertions(+) diff --git a/Userland/Shell/Builtin.cpp b/Userland/Shell/Builtin.cpp index 0e7703dca9..0315919edb 100644 --- a/Userland/Shell/Builtin.cpp +++ b/Userland/Shell/Builtin.cpp @@ -540,6 +540,31 @@ ErrorOr Shell::builtin_dirs(Main::Arguments arguments) return 0; } +ErrorOr Shell::builtin_eval(Main::Arguments arguments) +{ + if (!m_in_posix_mode) { + warnln("eval: This shell is not in POSIX mode"); + return 1; + } + + StringBuilder joined_arguments; + for (size_t i = 1; i < arguments.strings.size(); ++i) { + if (i != 1) + joined_arguments.append(' '); + joined_arguments.append(arguments.strings[i]); + } + + auto result = Posix::Parser { TRY(joined_arguments.to_string()) }.parse(); + if (!result) + return 1; + + auto value = TRY(result->run(*this)); + if (value && value->is_job()) + block_on_job(static_cast(value.ptr())->job()); + + return last_return_code.value_or(0); +} + ErrorOr Shell::builtin_exec(Main::Arguments arguments) { if (arguments.strings.size() < 2) { diff --git a/Userland/Shell/Shell.h b/Userland/Shell/Shell.h index e47b5d8a7a..9c11c978f7 100644 --- a/Userland/Shell/Shell.h +++ b/Userland/Shell/Shell.h @@ -32,6 +32,7 @@ __ENUMERATE_SHELL_BUILTIN(pwd, InAllModes) \ __ENUMERATE_SHELL_BUILTIN(type, InAllModes) \ __ENUMERATE_SHELL_BUILTIN(exec, InAllModes) \ + __ENUMERATE_SHELL_BUILTIN(eval, OnlyInPOSIXMode) \ __ENUMERATE_SHELL_BUILTIN(exit, InAllModes) \ __ENUMERATE_SHELL_BUILTIN(export, InAllModes) \ __ENUMERATE_SHELL_BUILTIN(glob, InAllModes) \