Как проверить, запущена ли программа в Bash на Ubuntu в Windows, а не просто на Ubuntu?
Довольно просто, обычные места для определения ОС, на которых вы находитесь, по-видимому, идентичны обычным Ubuntu на Ubuntu для Windows. Например, uname -a
идентичен встроенной установке GNU/Linux, а /etc/os-version
идентичен установке Ubuntu Trusty Tahr.
Единственное, что я могу придумать, это проверить, существует ли /mnt/c/Windows
, но я не уверен, что это надежная идея.
Ответы
Ответ 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.
Если вы используете только дистрибутив 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
не проверяет, установлена ли переменная, просто она пуста; на практике это работает достаточно хорошо в этом случае.)