diff options
author | AnotherTest <ali.mpfard@gmail.com> | 2021-03-07 09:42:24 +0330 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-03-07 10:58:42 +0100 |
commit | e1512d59688be4155a6b378de06b9a076063a640 (patch) | |
tree | dc2c8e64c77bcd137cf3cd0fdd1ae20f3c3f5301 | |
parent | 48347fb1c7df6f9645e8b48f7bacf7e82ba33f3d (diff) | |
download | serenity-e1512d59688be4155a6b378de06b9a076063a640.zip |
Shell: Skip caching PATH and history load/save when not interactive
Non-interactive shells (i.e. when running scripts) do not need this
functionality, so they are a boatload of wasted time.
This significantly reduces the script startup and shutdown times when
there are lots of executables in PATH or lots of entries in the history.
-rw-r--r-- | Userland/Shell/Builtin.cpp | 5 | ||||
-rw-r--r-- | Userland/Shell/Shell.cpp | 16 | ||||
-rw-r--r-- | Userland/Shell/Shell.h | 2 | ||||
-rw-r--r-- | Userland/Shell/main.cpp | 81 |
4 files changed, 62 insertions, 42 deletions
diff --git a/Userland/Shell/Builtin.cpp b/Userland/Shell/Builtin.cpp index 46322d7cb6..3b1cb9db33 100644 --- a/Userland/Shell/Builtin.cpp +++ b/Userland/Shell/Builtin.cpp @@ -299,9 +299,10 @@ int Shell::builtin_exit(int argc, const char** argv) } } stop_all_jobs(); - m_editor->save_history(get_history_path()); - if (m_is_interactive) + if (m_is_interactive) { + m_editor->save_history(get_history_path()); printf("Good-bye!\n"); + } exit(exit_code); return 0; } diff --git a/Userland/Shell/Shell.cpp b/Userland/Shell/Shell.cpp index 840f24356c..6d7c423332 100644 --- a/Userland/Shell/Shell.cpp +++ b/Userland/Shell/Shell.cpp @@ -1222,6 +1222,9 @@ String Shell::unescape_token(const String& token) void Shell::cache_path() { + if (!m_is_interactive) + return; + if (!cached_path.is_empty()) cached_path.clear_with_capacity(); @@ -1691,7 +1694,7 @@ Shell::Shell() cache_path(); } -Shell::Shell(Line::Editor& editor) +Shell::Shell(Line::Editor& editor, bool attempt_interactive) : m_editor(editor) { uid = getuid(); @@ -1705,7 +1708,7 @@ Shell::Shell(Line::Editor& editor) perror("gethostname"); auto istty = isatty(STDIN_FILENO); - m_is_interactive = istty; + m_is_interactive = attempt_interactive && istty; if (istty) { rc = ttyname_r(0, ttyname, Shell::TTYNameSize); @@ -1733,8 +1736,10 @@ Shell::Shell(Line::Editor& editor) } directory_stack.append(cwd); - m_editor->load_history(get_history_path()); - cache_path(); + if (m_is_interactive) { + m_editor->load_history(get_history_path()); + cache_path(); + } m_editor->register_key_input_callback('\n', [](Line::Editor& editor) { auto ast = Parser(editor.line()).parse(); @@ -1751,6 +1756,9 @@ Shell::~Shell() return; stop_all_jobs(); + if (!m_is_interactive) + return; + m_editor->save_history(get_history_path()); } diff --git a/Userland/Shell/Shell.h b/Userland/Shell/Shell.h index 8429e57190..08f8f89c04 100644 --- a/Userland/Shell/Shell.h +++ b/Userland/Shell/Shell.h @@ -264,7 +264,7 @@ public: #undef __ENUMERATE_SHELL_OPTION private: - Shell(Line::Editor&); + Shell(Line::Editor&, bool attempt_interactive); Shell(); virtual ~Shell() override; diff --git a/Userland/Shell/main.cpp b/Userland/Shell/main.cpp index 2d43167842..581edd93c1 100644 --- a/Userland/Shell/main.cpp +++ b/Userland/Shell/main.cpp @@ -60,21 +60,6 @@ int main(int argc, char** argv) s_shell->editor()->save_history(s_shell->get_history_path()); }); - editor = Line::Editor::construct(); - editor->initialize(); - - auto shell = Shell::Shell::construct(*editor); - s_shell = shell.ptr(); - - s_shell->setup_signals(); - -#ifndef __serenity__ - sigset_t blocked; - sigemptyset(&blocked); - sigaddset(&blocked, SIGTTOU); - sigaddset(&blocked, SIGTTIN); - pthread_sigmask(SIG_BLOCK, &blocked, nullptr); -#endif #ifdef __serenity__ if (pledge("stdio rpath wpath cpath proc exec tty accept sigaction unix fattr", nullptr) < 0) { perror("pledge"); @@ -82,23 +67,43 @@ int main(int argc, char** argv) } #endif - shell->termios = editor->termios(); - shell->default_termios = editor->default_termios(); - - editor->on_display_refresh = [&](auto& editor) { - editor.strip_styles(); - if (shell->should_format_live()) { - auto line = editor.line(); - ssize_t cursor = editor.cursor(); - editor.clear_line(); - editor.insert(shell->format(line, cursor)); - if (cursor >= 0) - editor.set_cursor(cursor); - } - shell->highlight(editor); - }; - editor->on_tab_complete = [&](const Line::Editor&) { - return shell->complete(); + RefPtr<::Shell::Shell> shell; + bool attempt_interactive = false; + + auto initialize = [&] { + editor = Line::Editor::construct(); + editor->initialize(); + + shell = Shell::Shell::construct(*editor, attempt_interactive); + s_shell = shell.ptr(); + + s_shell->setup_signals(); + +#ifndef __serenity__ + sigset_t blocked; + sigemptyset(&blocked); + sigaddset(&blocked, SIGTTOU); + sigaddset(&blocked, SIGTTIN); + pthread_sigmask(SIG_BLOCK, &blocked, nullptr); +#endif + shell->termios = editor->termios(); + shell->default_termios = editor->default_termios(); + + editor->on_display_refresh = [&](auto& editor) { + editor.strip_styles(); + if (shell->should_format_live()) { + auto line = editor.line(); + ssize_t cursor = editor.cursor(); + editor.clear_line(); + editor.insert(shell->format(line, cursor)); + if (cursor >= 0) + editor.set_cursor(cursor); + } + shell->highlight(editor); + }; + editor->on_tab_complete = [&](const Line::Editor&) { + return shell->complete(); + }; }; const char* command_to_run = nullptr; @@ -118,8 +123,6 @@ int main(int argc, char** argv) parser.parse(argc, argv); - shell->set_live_formatting(should_format_live); - if (format) { auto file = Core::File::open(format, Core::IODevice::ReadOnly); if (file.is_error()) { @@ -127,6 +130,8 @@ int main(int argc, char** argv) return 1; } + initialize(); + ssize_t cursor = -1; puts(shell->format(file.value()->read_all(), cursor).characters()); return 0; @@ -152,6 +157,12 @@ int main(int argc, char** argv) } } + auto execute_file = file_to_read_from && StringView { "-" } != file_to_read_from; + attempt_interactive = !execute_file; + + initialize(); + + shell->set_live_formatting(should_format_live); shell->current_script = argv[0]; if (!skip_rc_files) { @@ -179,7 +190,7 @@ int main(int argc, char** argv) return shell->run_command(command_to_run); } - if (file_to_read_from && StringView { "-" } != file_to_read_from) { + if (execute_file) { if (shell->run_file(file_to_read_from)) return 0; return 1; |