Довольно просто, обычные места для определения ОС, на которой вы работаете, кажутся идентичными простой Ubuntu в Ubuntu для Windows. Например, uname -a идентично стандартной установке GNU/Linux, а /etc/os-version идентично установке Ubuntu Trusty Tahr.
Единственное, что я могу придумать, это проверить, существует ли /mnt/c/Windows , но я не уверен, что это надежная идея.
DrKabob 28 Июн 2016 в 23:58
13 ответов
Следующее работает в bash в Windows 10, macOS и Linux:
#!/bin/bash set -e if grep -qEi «(Microsoft|WSL)» /proc/version /dev/null ; then echo «Windows 10 Bash» else echo «Anything else» fi
Вам необходимо проверить как «Microsoft», так и «WSL» на этот комментарий Бен Хиллис, разработчик WSL:
На данный момент это, вероятно, лучший способ сделать это. Я не могу обещать, что мы никогда не изменим содержимое этих файлов ProcFs, но я думаю, что маловероятно, что мы изменим его на что-то, что не содержит «Microsoft» или «WSL».
Ubuntu 22.04 настройка после установки. Ликбез
/proc/sys/kernel/osrelease /proc/version
И регистр должен игнорироваться для grep . В WSL2 /proc/version означает Microsoft в нижнем регистре.
Atif 14 Июл 2020 в 08:40
Niklas Holm
11 Янв 2019 в 10:58
Комментируя добавить, что в WSL 2 написано «Microsoft», все в нижнем регистре.
Marc Cornellà
19 Сен 2019 в 21:16
Остерегаться! анализируя /proc/version, он может содержать вводящую в заблуждение информацию (представьте себе gcc, скомпилированный Microsoft). Лучше парсить только версию ядра: /proc/sys/kernel/osrelease
26 Авг 2021 в 15:11
NotTheDr01ds
26 Авг 2021 в 22:40
if [[ -n «$IS_WSL» || -n «$WSL_DISTRO_NAME» ]]; then echo «This is WSL» else echo «This is not WSL» fi
Примечание. IS_WSL существовало в более ранних версиях (с использованием lxrun ), а WSL_DISTRO_NAME существует в текущих версиях (из Microsoft Store).
iBug 8 Янв 2021 в 19:30
Логика обратная, первый случай — wsl: if [[ ! -z «$IS_WSL» ! -z «$WSL_DISTRO_NAME» ]]; затем эхо «Вы находитесь в wsl!» else echo «Вы не в wsl!» фи
8 Ноя 2020 в 22:09
Это самый быстрый и эффективный способ проверить наличие WSL. Нет необходимости действительно проходить через grep или читать /proc или вызывать внешний исполняемый файл, такой как uname.
Daniel Kim
2 Мар 2021 в 18:01
Этот метод на 100% лучше, чем принятый ответ, потому что он также работает при запуске собственного скомпилированного ядра под WSL2. Другими присутствующими переменными среды являются WSL_INTEROP и WSLENV .
23 Июл 2021 в 22:34
Ммм, я не могу найти переменную среды, начинающуюся с WSL. WINDOWS 10 20H2, сборка 19042.1165, UBUNTU 18.04.5 LTS, ядро 5.10.16.3-microsoft-standard-WSL2
26 Авг 2021 в 15:07
— Я использую ту же сборку Windows и выше работает нормально. У меня env var установлен как WSL_DISTRO_NAME=Ubuntu-20.04 . Используйте команду printenv для проверки.
[LINUX UP] Топ приложений и дополнений для Ubuntu 20.04
Shital Shah
15 Сен 2021 в 22:31
Без каких-либо специальных действий эти переменные окружения, похоже, уже установлены:
Итак, что-то вроде следующего фрагмента также должно работать в этом случае (пример того, что я использовал для себя):
if [ ! -z «$IS_WSL» ]; then alias code=’/mnt/c/Users/per/AppData/Local/Programs/Microsoft VS Code/Code.exe’ fi
(Обратите внимание, что технически -z не проверяет, не установлена ли переменная, а просто проверяет, что она пуста; в на практике, в данном случае это работает достаточно хорошо. ! в начале служит для отмены проверки.)
Per Lundberg 3 Ноя 2019 в 22:13
IS_WSL больше не доступен, но есть новая переменная с именем WSL_DISTRO_NAME.
Shital Shah
5 Апр 2020 в 02:42
Мне нужно было проверить macOS в дополнение к Windows Subsystem for Linux 2 .
Это самое простое, что у нас работает.
if [[ $OSTYPE == darwin* ]]; then # macOS elif [[ «$(
6 ответов
Каждый процесс будет указан в выводе ps aux ; будь то бег, сон, зомби или остановка.
Однако, в вашем случае, так как вы запустили процесс, используя sh abc.sh , sh это приложение (оболочка), которое работает, а не abc.sh , Следовательно, ps aux не будет содержать процесс abc.sh из-за которой grep не мог дать никакого результата.
Итак, правильный способ, которым вы должны были использовать это как:
ps aux | grep sh
Это также может вернуть вам другой процесс, который работает со строкой sh где-нибудь в их выводе ps aux ,
Вы должны отметить, что процесс будет «запущен», когда на выходе ps aux имеет свой STAT как R , Если это что-то отличное от этого, оно не запускается в том случае, если вы запустили команду для проверки запущенных процессов. Различные состояния процесса можно найти на странице руководства для ps:
D uninterruptible sleep (usually IO) R running or runnable (on run queue) S interruptible sleep (waiting for an event to complete) T stopped, either by a job control signal or because it is being traced W paging (not valid since the 2.6.xx kernel) X dead (should never be seen) Z defunct («zombie») process, terminated but not reaped by its parent
Вы могли бы также запустить top команда, чтобы проверить, запущен ли процесс или находится в спящем режиме, а также объем процессора, оперативной памяти, который он потребляет (Это снова перечислит ваш процесс как sh ).
Однако, если вы хотите, чтобы ваш процесс был указан как abc.sh , тогда у вас должна быть первая строка скрипта, который вы запускаете как:
#!/bin/sh
чтобы оболочка знала, какое приложение использовать для запуска скрипта (в этом случае sh, измените его на #!/bin/bash для bash) и затем предоставьте исполняемые права доступа процессу, используя:
chmod +x /path/to/abc.sh
замена /path/to/ с расположением abc.sh файл, а затем запустить abc.sh с помощью
/path/to/abc.sh
снова заменить /path/to/ с расположением abc.sh файл.
Источник: ask-ubuntu.ru