WSL, запуск команд Linux с помощью «wsl —exec » или «wsl — «

#linux #bash #powershell #windows-subsystem-for-linux

#linux #bash #powershell #windows-subsystem-for-linux

Вопрос:

wsl -h показывает следующее:

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

Что означает «без использования оболочки Linux по умолчанию» (т. Е. Что еще он будет использовать, если не оболочку по умолчанию !?)?.

Кроме того, в качестве примера, теперь у меня есть три возможных способа запуска Linux ls из моей командной строки PowerShell (т. Е. Это не будет Get-ChildItem псевдоним ls , а вместо этого команда Linux через WSL):

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

Но все выходные данные кажутся одинаковыми. Как бы вы объяснили различия между этими тремя способами запуска команды WSL Linux из командной строки PowerShell?

Комментарии:

1. с помощью wsl… используется /bin/bash. С помощью wsl -e…. Оболочка env. Это имеет большее значение, когда вы запускаете сценарии оболочки на wsl.

Ответ №1:

Я думаю, это означает, что wsl запускает команду directly , вместо того, чтобы запускать процесс оболочки для выполнения команды.

Например, если я запускаю :

 wsl -e sleep 10
 

С другого терминала у меня есть :

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

Мы видим /init , что это родительский элемент sleep 10 , без промежуточной оболочки.

Ответ №2:

Классный трюк заключается в использовании этого для установки переменной X11 $DISPLAY, позволяющей использовать Windows terminal для получения удаленных оболочек с помощью WSLG.

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

 

затем в удаленной системе

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

Комментарии:

1. Звучит неплохо, но я попробовал и не могу заставить его работать. Когда вы говорите $hostname , я предположил, что вы имели в виду замену этого на IP или имя хоста удаленной системы Linux, я пробовал оба способа, и все, что происходит, это то, что я подключаюсь к удаленной системе по ssh. Затем echo $DISPLAY ничего не отображается… Ввод xeyes результатов Error: Can't open display: . Вы работаете в Windows 11? Я использую Windows 10, но я настроил свой WSL для поддержки приложений с графическим интерфейсом, поэтому я подумал, что это должно сработать.

2. @YorSubs да, у вас должен быть Win11 или, по крайней мере, недавно исправленная Windows 10. WSLG находится в Windows 11. У вас должен быть WSL2 WSLG специально. github.com/microsoft/wslg/issues/730

3. github.com/microsoft/terminal/issues/13041