'WSL, Running linux commands with "wsl --exec <cmd>" or "wsl -- <cmd>"

wsl -h shows the following:

    --exec, -e <CommandLine>   Execute the specified command without using the default Linux shell.
    --   Pass the remaining command line as is.

What does "without using the default Linux shell" mean (i.e. what else is it going to use, if not the default shell!?)?.

Additionally, by way of an example, I now have three possible ways to run Linux ls from my PowerShell prompt (i.e. this will not be Get-ChildItem aliased to ls, but instead a Linux command via WSL):

PS C:\> wsl -e ls   # Alternatively,  wsl --exec ls
PS C:\> wsl -- ls
PS C:\> wsl ls

But all outputs appear to be the same. How would you explain the differences between these three ways of running a WSL Linux command from a PowerShell prompt?



Solution 1:[1]

I think it means wsl runs the command directly, instead of spawning a shell process to run the command.

For example, if I run :

wsl -e sleep 10

From another terminal, I have :

root      1482     1  0 11:32 tty3     00:00:00 /init
ubuntu    1483  1482  0 11:32 tty3     00:00:00 sleep 10

We can see /init is the parent of sleep 10, without a shell in between.

Solution 2:[2]

A cool trick is using this to set the X11 $DISPLAY variable, letting you use windows terminal to get remote shells using WSLG.

# in microsoft terminal or powershell use this command line
wsl.exe -- ssh -a -X -Y $hostname

then on the remote system

# DISPLAY will show something like localhost:10.0 on the remote system
echo $DISPLAY
# use a program like xeyes to test
xeyes

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Philippe
Solution 2 Brian Horakh