-
Notifications
You must be signed in to change notification settings - Fork 7.4k
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
pwsh as a dotnet global tool exhibits very unusual behavior with Ctrl-C #11314
Comments
This isn't limited to pwsh as a dotnet global tool. pwsh.exe exits whenever Ctrl + C is pressed in a long-running child process if pwsh.exe has been invoked from another terminal, e.g. powershell.exe or cmd.exe. This makes it impossible to kill long-running native commands without also killing the whole terminal. For example, the following works as expected:
However, the following occurs, but isn't expected behavior:
The following unexpected behavior also occurs, as described in #3869:
This means pwsh is very difficult to use for anything serious in Windows Terminal, since cancelling a command kills the whole shell. |
Update: I was on 6.2.3 when I observed that behavior. I've since installed 7.0.0-rc1 and am no longer able to reproduce it. There's a possibility I had installed it as a dotnet global tool before, but I thought I downloaded it directly from GitHub. This time I installed it via the MSI on GitHub. |
FWIW, I'm seeing this behavior in Windows Terminal with PowerShell installed via https://scoop.sh. Both 6.2.3 and 7.0.0-rc1 are acting similarly for me. Here's the output from 7.0.0-rc1:
Starting in Running |
Unless Scoop is using the dotnet global tool wrapper shipped with PowerShell, this is likely an issue affecting all Scoop-shimmed console-subsystem binaries. It’s almost certainly worth filing a duplicate of this issue on them so they can fix it for everyone. |
Powershell Core installed as dotnet global tool.
|
Yes- this happens because Windows Terminal tracks the process that it has spawned, which in this case is the dotnet global tool wrapper. The wrapper is intercepting |
@SteveL-MSFT This is interesting and we should figure this out. I means that anyone using PowerShell like this loses the whole process when pressing Ctrl-C @KathleenDollard for visibility. This makes PowerShell installed as a dotnet global tool not really usable. |
This happens so frequently, like whenever I want to stop the output of a long "dir" with Ctrl-C that I had to stop using Windows Terminal. |
@ssg I am very sympathetic and I'll work to get it fixed, but a better solution would be to NOT use Pwsh as a .NET global Tool. Just install PowerShell Core and you won't have this issue and you can use Windows Terminal. |
Please increase priority of the issue, I just moved from conemu, but the bug makes terminal+core near useless for work. |
As noted, current mitigation is to install via the MSI or zip instead. |
@SteveL-MSFT Could you please clarify about zip, because I supposed that it is the same that scoop does. |
@inv2004 we also publish a zip pkg for Windows. You can just unzip and run the contained |
@shanselman This workaround is great and it works, thanks! But the first hit on Google for downloading PowerShell Core still suggests dotnet global tool as the first option in the Tip box, and doesn't warn the user about implications, could it be revised at least?: https://docs.microsoft.com/en-us/powershell/scripting/install/installing-powershell-core-on-windows?view=powershell-7
|
Personally, I agree @ssg that while PowerShell Core installed via a .NET Global Tool would be the ideal way to get PWSH on a machine, we shouldn't recommend it OR we should include a warning that it won't work with Windows Terminal for now. @sdwheeler @KathleenDollard |
Pretty simple fix in the end, just wasn't immediately obvious to me so here is what I did. Just edit Windows Terminal settings such that your using Originally I had: {
"guid": "{b91d6aa8-b68c-416b-89b4-f29a2abebdcd}",
"name": "Windows PowerShell Core",
"commandline": "pwsh.exe", // which resolves to C:\Users\brad.jones\scoop\shims\pwsh.exe
"hidden": false,
"fontSize": 10,
"padding": "1",
"icon": "C:\\Users\\brad.jones\\Pictures\\PowerShell_Core_6.0_icon.png",
"startingDirectory": "%USERPROFILE%"
} Updated to: {
"guid": "{b91d6aa8-b68c-416b-89b4-f29a2abebdcd}",
"name": "Windows PowerShell Core",
"commandline": "C:\\Users\\brad.jones\\scoop\\apps\\powershell-core\\current\\pwsh.exe",
"hidden": false,
"fontSize": 10,
"padding": "1",
"icon": "C:\\Users\\brad.jones\\Pictures\\PowerShell_Core_6.0_icon.png",
"startingDirectory": "%USERPROFILE%"
} |
@brad-jones "commandline": "%USERPROFILE%\\scoop\\apps\\pwsh\\current\\pwsh.exe", |
I agree with @ssg, the docs should mention that you need to use the msi package and not the dotnet tool installation. Searching for the cause of the problem finally brought me this issue here. I hope this is going to get fixed soon. Besides that: Nice job! The new terminal might replace cmdr for me. 👍 |
🎉This issue was addressed in #11959, which has now been successfully released as Handy links: |
I can confirm this is still a problem with PowerShell 7.0.0 on Windows 10 build 1909 with Windows Terminal 0.11.1251.0 @SteveL-MSFT please re-open the ticket |
Are you using scoop? If you're using scoop then you need to make sure you're not using the global shim for |
I installed PowerShell 7 with Scoop. Here is the default configuration in Windows Terminal. It's using {
"guid": "{574e775e-4f2a-5b96-ac1e-a2962a402336}",
"hidden": false,
"name": "PowerShell",
"source": "Windows.Terminal.PowershellCore",
"colorScheme": "Galaxy"
} |
Then replace your shims and it'll start working. it's a scoop issue, not a powershell issue. |
Awesome workaround!
|
For what it's worth, and for those who might not know the difference: When using chocolatey, installing the Install the |
Steps to reproduce
Install powershell as a dotnet global tool. Run a long-running thing (like Start-Sleep), and then press Ctrl+C
Expected behavior
I am returned to a powershell prompt.
Actual behavior
The dotnet tool shim hosting powershell terminates and returns control to cmd, but powershell remains connected to the console and reads input simultaneously. PowerShell and CMD share the input buffer, and neither of them can agree on what goes into it.
If you manage to exit cmd, powershell re-asserts control.
The
dir
in the snippet below came from cmdThe blue
d
came from powershell, and their
came from cmd.Environment data
The text was updated successfully, but these errors were encountered: