Terminal: Ctrl+D (EOF) input doesn't close a WSL terminal

Created on 15 Jan 2020  路  10Comments  路  Source: microsoft/terminal

Environment

Windows build number: Microsoft Windows [Version 10.0.18362.356]
Windows Terminal version: v0.8.10091.0

I'm using the zsh shell.
The "closeOnExit" setting set to `true`, but the behavior is the same regardless.

Steps to reproduce

  1. Open Windows Terminal
  2. Run a command or execute a program that exits with a code other than 0
  3. Press Ctrl+D

Expected behavior

Terminal window (or tab) is closed as if the exit command was given.

Actual behavior

Terminal prints a new line and then [process exited with code 127] (the number being the previous command's exit code), and finally an input prompt on the same line, but no text input is accepted. Terminal session is halted and doesn't accept input (surrounding UI and new tabs do work).

I believe this behavior is new in the 0.8... version and didn't exist in the previous official preview release. Running the same WSL environment via cmd.exe also behaves as expected, immediately closing the command line after entering the EOF code.

Also in other exit code cases (such as giving Ctrl+D directly to a fresh terminal), Windows Terminal exits as expected.

Visual example:
image

Needs-Tag-Fix Needs-Triage Resolution-By-Design

Most helpful comment

This is the new implementation of closeOnExit. Read all about in the release notes. The problem you describe annoyed me as well. I added a global setting (see the release notes how to update your config file) and set closeOnExit to always.

"defaults": {
    "closeOnExit": "always"
},

Another problem is that it is not possible to close the tab with the keyboard when the error you describe occurs, at least I couldn't find any. But maybe that needs a separate issue.

All 10 comments

This is the new implementation of closeOnExit. Read all about in the release notes. The problem you describe annoyed me as well. I added a global setting (see the release notes how to update your config file) and set closeOnExit to always.

"defaults": {
    "closeOnExit": "always"
},

Another problem is that it is not possible to close the tab with the keyboard when the error you describe occurs, at least I couldn't find any. But maybe that needs a separate issue.

not possible

We haven鈥檛 had any trouble with Ctrl+Shift+W after the connection closes unexpectedly.

We are still evaluating to see whether this (^D causing abnormal termination of the shell) is expected for Linux shells or not. Even if it鈥檚 not expected, this will be a _wsl_ issue instead of a Terminal issue. If it _is_ expected, this鈥檒l just have to be by-design.

Alright! This one is just by design. Sorry.

% zsh -l; echo "shell exited with code $?"
% ^D
shell exited with code 0

% zsh -l; echo "shell exited with code $?"
% false
% ^D
shell exited with code 1

% bash -l; echo "shell exited with code $?"
$ ^D
shell exited with code 0

% bash -l; echo "shell exited with code $?"
$ false
$ ^D
shell exited with code 1

It looks like a shell terminated with ^D propagates out the exit code of the last thing that happened:

% bash -l; echo "shell exited with code $?"
$ ( exit 100 )
$ ^D
shell exited with code 100

Terminal (and any other terminal emulator that supports this, like iTerm2 on macOS or ConEmu or ...) has no way of knowing that the "failed" exit code was, in fact, one propagated out of the process on somebody else's behalf.

As far as workaround: closeOnExit -> always is very good for shells you know and trust, but we can't set it by default on all WSL instances because then we'd fail to catch any _unexpected_ failures ("distro doesn't exist", "wsl subsystem is down", etc.) and the user's terminal would immediately flicker open and close.

And as a final note, the test above was performed on actual Linux. 馃榾

Thanks, the "always" option seems to yield the expected result always. Also, running the same test as above on a native Ubuntu 18.04 yields the same result as well, the terminal is immediately closed on Ctrl+D.

The native Ubuntu terminal does not do process exit code detection by default. Because of this, if your shell is misconfigured it will open, print out a heap of text, and then close without letting you see it.

It looks like it's configurable. If you set this...

image

to _Hold the terminal open_, you get this -- even if you use ^D

image

(I did use ^D, but bash prints exit or logout when you do that.)

We chose to hold the terminal open by default as we think it's a better experience.

not possible

We haven鈥檛 had any trouble with Ctrl+Shift+W after the connection closes unexpectedly.

My bad, sorry for that noise 馃槙

@DHowett-MSFT Would it be possible to add an explanation message when this happens? It's the default behavior on WSL and it's quite confusing to see a tab stay open with an error. I couldn't figure whether something was wrong with WSL, bash, or the terminal app.

If we could detect that there was an exit code _caused by the user pressing Ctrl+D_, we would have circumvented the message entirely and closed the window :smile:

Was this page helpful?
0 / 5 - 0 ratings