diff --git a/Shell/GlobalState.h b/Shell/GlobalState.h index e92dd8df3e2..645652f4ac4 100644 --- a/Shell/GlobalState.h +++ b/Shell/GlobalState.h @@ -13,6 +13,7 @@ struct GlobalState { pid_t sid; uid_t uid; struct termios termios; + struct termios default_termios; bool was_interrupted { false }; bool was_resized { false }; int last_return_code { 0 }; diff --git a/Shell/main.cpp b/Shell/main.cpp index 28b4a3519fe..2dc62b07028 100644 --- a/Shell/main.cpp +++ b/Shell/main.cpp @@ -634,6 +634,7 @@ static int run_command(const String& cmd) struct termios trm; tcgetattr(0, &trm); + tcsetattr(0, TCSANOW, &g.default_termios); struct SpawnedProcess { String name; @@ -840,7 +841,12 @@ int main(int argc, char** argv) g.uid = getuid(); g.sid = setsid(); tcsetpgrp(0, getpgrp()); - tcgetattr(0, &g.termios); + tcgetattr(0, &g.default_termios); + g.termios = g.default_termios; + // Because we use our own line discipline which includes echoing, + // we disable ICANON and ECHO. + g.termios.c_lflag &= ~(ECHO | ICANON); + tcsetattr(0, TCSANOW, &g.termios); signal(SIGINT, [](int) { g.was_interrupted = true;