Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ctrl+D (EOF) input doesn't close a WSL terminal #4223

Closed
armak opened this issue Jan 14, 2020 · 10 comments
Closed

Ctrl+D (EOF) input doesn't close a WSL terminal #4223

armak opened this issue Jan 14, 2020 · 10 comments
Labels
Needs-Tag-Fix Doesn't match tag requirements Needs-Triage It's a new issue that the core contributor team needs to triage at the next triage meeting Resolution-By-Design It's supposed to be this way. Sometimes for compatibility reasons.

Comments

@armak
Copy link

armak commented Jan 14, 2020

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

@ghost ghost added Needs-Triage It's a new issue that the core contributor team needs to triage at the next triage meeting Needs-Tag-Fix Doesn't match tag requirements labels Jan 14, 2020
@ffes
Copy link

ffes commented Jan 15, 2020

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.

@DHowett-MSFT
Copy link
Contributor

not possible

We haven’t 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’s not expected, this will be a wsl issue instead of a Terminal issue. If it is expected, this’ll just have to be by-design.

@DHowett-MSFT
Copy link
Contributor

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.

@DHowett-MSFT
Copy link
Contributor

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.

@DHowett-MSFT
Copy link
Contributor

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

@armak
Copy link
Author

armak commented Jan 15, 2020

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.

@DHowett-MSFT
Copy link
Contributor

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.

@ffes
Copy link

ffes commented Jan 16, 2020

not possible

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

My bad, sorry for that noise 😕

@a-gn
Copy link

a-gn commented Feb 25, 2020

@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.

@DHowett-MSFT
Copy link
Contributor

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 😄

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Needs-Tag-Fix Doesn't match tag requirements Needs-Triage It's a new issue that the core contributor team needs to triage at the next triage meeting Resolution-By-Design It's supposed to be this way. Sometimes for compatibility reasons.
Projects
None yet
Development

No branches or pull requests

4 participants