From 50473003be354d0f5bf07606dd22c4c3ac68ab6d Mon Sep 17 00:00:00 2001 From: AnotherTest Date: Mon, 18 Jan 2021 10:05:00 +0330 Subject: [PATCH] Shell: Add a `not` builtin `not` just takes a command, runs it, then negates its exit code (0->1, non-zero->0). --- Userland/Shell/Builtin.cpp | 19 +++++++++++++++++++ Userland/Shell/Shell.h | 1 + 2 files changed, 20 insertions(+) diff --git a/Userland/Shell/Builtin.cpp b/Userland/Shell/Builtin.cpp index 731710af43..46322d7cb6 100644 --- a/Userland/Shell/Builtin.cpp +++ b/Userland/Shell/Builtin.cpp @@ -879,6 +879,25 @@ int Shell::builtin_unset(int argc, const char** argv) return 0; } +int Shell::builtin_not(int argc, const char** argv) +{ + // FIXME: Use ArgsParser when it can collect unrelated -arguments too. + if (argc == 1) + return 1; + + AST::Command command; + for (size_t i = 1; i < (size_t)argc; ++i) + command.argv.append(argv[i]); + + auto commands = expand_aliases({ move(command) }); + int exit_code = 1; + for (auto& job : run_commands(commands)) { + block_on_job(job); + exit_code = job.exit_code(); + } + return exit_code == 0 ? 1 : 0; +} + bool Shell::run_builtin(const AST::Command& command, const NonnullRefPtrVector& rewirings, int& retval) { if (command.argv.is_empty()) diff --git a/Userland/Shell/Shell.h b/Userland/Shell/Shell.h index 1aa65b343f..8429e57190 100644 --- a/Userland/Shell/Shell.h +++ b/Userland/Shell/Shell.h @@ -52,6 +52,7 @@ __ENUMERATE_SHELL_BUILTIN(unset) \ __ENUMERATE_SHELL_BUILTIN(history) \ __ENUMERATE_SHELL_BUILTIN(umask) \ + __ENUMERATE_SHELL_BUILTIN(not ) \ __ENUMERATE_SHELL_BUILTIN(dirs) \ __ENUMERATE_SHELL_BUILTIN(pushd) \ __ENUMERATE_SHELL_BUILTIN(popd) \