Подтвердить что ты не робот

Как проверить, запущена ли программа в Bash на Ubuntu в Windows, а не просто на Ubuntu?

Довольно просто, обычные места для определения ОС, на которых вы находитесь, по-видимому, идентичны обычным Ubuntu на Ubuntu для Windows. Например, uname -a идентичен встроенной установке GNU/Linux, а /etc/os-version идентичен установке Ubuntu Trusty Tahr.

Единственное, что я могу придумать, это проверить, существует ли /mnt/c/Windows, но я не уверен, что это надежная идея.

4b9b3361

Ответ 1

В bash работает в Windows 10, macOS и Linux:

#!/bin/bash
set -e
if grep -qE "(Microsoft|WSL)" /proc/version &> /dev/null ; then
    echo "Windows 10 Bash"
else
    echo "Anything else"
fi

Вам нужно проверить как "Microsoft", так и "WSL" за этот комментарий от Ben Hillis, WSL Developer:

На данный момент это, вероятно, лучший способ сделать это. Я не могу обещают, что мы никогда не изменим содержание этих файлов ProcFs, но Я думаю, что вряд ли мы изменим его на то, что не содержат "Microsoft" или "WSL".

/proc/sys/kernel/osrelease
/proc/version

Ответ 2

Я искал способы обнаружить это. До сих пор я нашел 2.

  • /proc/sys/kernel/osrelease - "3.4.0-Microsoft"

  • /proc/version: "Linux версия 3.4.0-Microsoft ([email protected]) (версия gcc 4.7 (GCC)) # 1 SMP PREEMPT Ср Дек 31 14:42:53 PST 2014 "

Если вы используете только дистрибутив Ubuntu, установленный по умолчанию, не должно быть проблем с их использованием, поскольку они сказали, что было бы маловероятно, чтобы они установили либо к тому, что не содержит "Microsoft" или "WSL" .

Однако, если бы вы установили другой дистрибутив Linux, я уверен, что содержимое /proc/sys/kernel/osrelease и /proc/version изменится, так как дистрибутив не был скомпилирован Microsoft.

Ответ 3

Я просто придумал это для моего .bashrc для добавления некоторых элементов WSL в $PATH.

Работает в 1703 году. Не уверен, что более ранние версии.

if [[ $(uname -r) =~ Microsoft$ ]]; then
    foo
fi

Ответ 4

Вот что я положил в мой .bashrc

if [[ $(uname -v | sed -rE 's/^#[0-9]{3,}-(\S+).+/\1/') == "Microsoft" ]]; then
  # WSL-specific code
fi
  • uname -v получает версию ядра в формате #379-Microsoft Wed Mar 06 19:16:00 PST 2019 и выражение sed вытягивает строку Microsoft.

Ответ 5

Если вы в Bash и хотите избежать fork:

is_wsl=0
read os </proc/sys/kernel/osrelease || :
if [[ "$os" == *Microsoft ]]; then
  is_wsl=1
fi

Ответ 6

Подсистема Windows для Linux 2 (WSL 2) в Windows 10 Pro Insider Preview Build 18917

/proc/version содержит:

Версия Linux 4.19.43-microsoft-standard (oe-user @oe-host) (gcc версия 7.3.0 (GCC)) # 1 SMP...

Ответ 7

Если я не сделаю ничего особенного, эти переменные среды уже установлены:

$ set | grep WSL
IS_WSL='Linux version 4.4.0-18362-Microsoft ([email protected]) (gcc version 5.4.0 (GCC) ) #1-Microsoft Mon Mar 18 12:02:00 PST 2019'
WSLENV=
WSL_DISTRO_NAME=Debian

Итак, что-то вроде следующего фрагмента также должно работать в этом случае (пример того, что я использовал для себя):

if [ ! -z "$IS_WSL" ]; then
    alias code='/mnt/c/Users/per/AppData/Local/Programs/Microsoft\ VS\ Code/Code.exe'
fi

(Обратите внимание, что технически -z не проверяет, установлена ли переменная, просто она пуста; на практике это работает достаточно хорошо в этом случае.)